1. 程式人生 > 程式設計 >在django admin中配置搜尋域是一個外來鍵時的處理方法

在django admin中配置搜尋域是一個外來鍵時的處理方法

python 2.7.11

django 1.8.4

錯誤內容:related Field has invalid lookup: icontains

我原來預設認為在處理外來鍵搜尋的時候,django會自動將該外來鍵的行資料以str()化之後進行搜尋,但其實並不是這樣的,如果將外來鍵加入到搜尋域中,需要明確寫出來。

這個是我從網上查到的解決方案,測試可用,如下:

models.py 檔案

# coding:utf8
from django.db import models

class Book(models.Model):
  
  name = models.CharField(max_length=255)
  title = models.CharField(max_length=255)
  price = models.IntegerField()
  ...
  
class Category(models.Model):
  
  CATEGORY_CHOICES = (
    ('00','English'),('01','Computer'),)
  
  book = models.ForeignKey(Book)
  category = models.CharField(max_length=255,choices=CATEGORY_CHOICES)
  remark = models.CharField(max_length=255)
  ...

admin.py 檔案(以 category 為例)

# coding: utf8
from django.contrib import admin
from django import forms

from .models import Category

class CategoryAdmin(admin.ModelAdmin):

  search_fileds = ('book__name','book__title','book__price','category') # 設定搜尋欄範圍,如果有外來鍵,要註明外來鍵的哪個欄位,雙下劃線
  list_display = ('book','category') # 在頁面上顯示的欄位,若不設定則顯示 models.py 中 __unicode__(self) 中所返回的值
  list_display_links = ('category') # 設定頁面上哪個欄位可單擊進入詳細頁面
  fields = ('category','book') # 設定新增/修改詳細資訊時,哪些欄位顯示,在這裡 remark 欄位將不顯示
  
admin.site.register(Category,CategoryAdmin)

[ 說明 ]

在使用 Django admin 系統中的搜尋時可能會出現“related Field has invalid lookup: icontains”錯誤,主要原因是外來鍵查詢是需要指定相應的欄位的。

外來鍵不應該只是一個model,而該是另一個表的明確的一個欄位。

所以我們需要指定特定的欄位 "本表外來鍵欄位__外來鍵所在表需查詢欄位"。

補充知識:Django的model中使用外來鍵,但在頁面上顯示的是xxx_object?

在Django中定義瞭如下A,B兩個模型:

class A:
   name=models.CharField(max_length=15)
   def __unicode__(self):
       return self.name
 
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __unicode__(self):
      return self.name

注:我在測試環境中使用的是python2.7,一切操作做完之後,部署到雲伺服器上後,就在後臺管理系統中看到B的屬性一欄中f顯示為A_Object,並沒有顯示A的屬性——name的值。

究其緣由,發現我的雲伺服器上用的是python3.6,在這裡要將__unicode__()方法替換成__str__()方法才行.

class A:
   name=models.CharField(max_length=15)
   def __str__(self):
       return self.name
 
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __str__(self):
      return self.name

當然,如果使用的版本是python3.x,為了更好地相容python2.x,可以使用@python_2_unicode_compatible裝飾器來使python2.x想python3.x一樣處理Unicode字元。

from django.utils.encoding import python_2_unicode_compatible
 
@python_2_unicode_compatible
class A:
   name=models.CharField(max_length=15)
   def __str__(self):
       return self.name
 
@python_2_unicode_compatible
class B:
   name=models.CharField(max_length=15)
   f=models.ForeignKey(A,on_delete=models.DO_NOTHING)
 
   def __str__(self):
      return self.name

以上這篇在django admin中配置搜尋域是一個外來鍵時的處理方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。