在django admin中配置搜索域是一个外键时的处理方法
python2.7.11
django1.8.4
错误内容:relatedFieldhasinvalidlookup:icontains
我原来默认认为在处理外键搜索的时候,django会自动将该外键的行数据以str()化之后进行搜索,但其实并不是这样的,如果将外键加入到搜索域中,需要明确写出来。
这个是我从网上查到的解决方案,测试可用,如下:
models.py文件
#coding:utf8 fromdjango.dbimportmodels classBook(models.Model): name=models.CharField(max_length=255) title=models.CharField(max_length=255) price=models.IntegerField() ... classCategory(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 fromdjango.contribimportadmin fromdjangoimportforms from.modelsimportCategory classCategoryAdmin(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)
[说明]
在使用Djangoadmin系统中的搜索时可能会出现“relatedFieldhasinvalidlookup:icontains”错误,主要原因是外键查询是需要指定相应的字段的。
外键不应该只是一个model,而该是另一个表的明确的一个字段。
所以我们需要指定特定的字段"本表外键字段__外键所在表需查询字段"。
补充知识:Django的model中使用外键,但在页面上显示的是xxx_object?
在Django中定义了如下A,B两个模型:
classA: name=models.CharField(max_length=15) def__unicode__(self): returnself.name classB: name=models.CharField(max_length=15) f=models.ForeignKey(A,on_delete=models.DO_NOTHING) def__unicode__(self): returnself.name
注:我在测试环境中使用的是python2.7,一切操作做完之后,部署到云服务器上后,就在后台管理系统中看到B的属性一栏中f显示为A_Object,并没有显示A的属性——name的值。
究其缘由,发现我的云服务器上用的是python3.6,在这里要将__unicode__()方法替换成__str__()方法才行.
classA: name=models.CharField(max_length=15) def__str__(self): returnself.name classB: name=models.CharField(max_length=15) f=models.ForeignKey(A,on_delete=models.DO_NOTHING) def__str__(self): returnself.name
当然,如果使用的版本是python3.x,为了更好地兼容python2.x,可以使用@python_2_unicode_compatible装饰器来使python2.x想python3.x一样处理Unicode字符。
fromdjango.utils.encodingimportpython_2_unicode_compatible @python_2_unicode_compatible classA: name=models.CharField(max_length=15) def__str__(self): returnself.name @python_2_unicode_compatible classB: name=models.CharField(max_length=15) f=models.ForeignKey(A,on_delete=models.DO_NOTHING) def__str__(self): returnself.name
以上这篇在djangoadmin中配置搜索域是一个外键时的处理方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。