Skip to main content
 首页 » 编程设计

python之在 Django 管理中搜索时出错

2024年08月20日33jackei

这是我的代码的相关部分:

model.py

class Blogger(models.Model): 
    identity = models.ForeignKey(User, models.SET_NULL, null=True) 
 
    def __str__(self): 
        return self.identity.username 

我希望能够使用他们的 blogger_instance.identity.username 搜索博主,所以我这样做了:

admin.py

@admin.register(Blogger) 
class BloggerAdmin(admin.ModelAdmin): 
    list_display = ('__str__', 'identity') 
    search_fields = ['__str__'] 

我去了 http://127.0.0.1:8000/admin/blog/blogger/,在搜索字段中输入 user,点击 Search,并得到一个FieldError:

FieldError at /admin/blog/blogger/ 
Cannot resolve keyword '' into field. Choices are: bio, blog, comment, id, identity, identity_id 
Request Method: GET 
Request URL:    http://127.0.0.1:8000/admin/blog/blogger/?q=user 
Django Version: 1.10.6 
Exception Type: FieldError 
Exception Value:     
Cannot resolve keyword '' into field. Choices are: bio, blog, comment, id, identity, identity_id 
Exception Location: /Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages/django/db/models/sql/query.py 
in names_to_path, line 1327 
Python Executable:  /Users/sunqingyao/Envs/django_test/bin/python 
Python Version: 3.6.0 
Python Path:     
['/Users/sunqingyao/PycharmProjects/diyblog', 
 '/Users/sunqingyao/PycharmProjects/diyblog', 
 '/Users/sunqingyao/Envs/django_test/lib/python36.zip', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/lib-dynload', 
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages'] 
Server time:    Tue, 28 Mar 2017 13:01:58 +0800 

当我改变

search_fields = ['__str__'] 

到

search_fields = ['identity'] 

我得到了一个TypeError:

TypeError at /admin/blog/blogger/ 
Related Field got invalid lookup: icontains 
Request Method: GET 
Request URL:    http://127.0.0.1:8000/admin/blog/blogger/?q=user 
Django Version: 1.10.6 
Exception Type: TypeError 
Exception Value:     
Related Field got invalid lookup: icontains 
Exception Location: /Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages/django/db/models/fields/related.py in get_lookup, line 694 
Python Executable:  /Users/sunqingyao/Envs/django_test/bin/python 
Python Version: 3.6.0 
Python Path:     
['/Users/sunqingyao/PycharmProjects/diyblog', 
 '/Users/sunqingyao/PycharmProjects/diyblog', 
 '/Users/sunqingyao/Envs/django_test/lib/python36.zip', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/lib-dynload', 
 '/usr/local/Cellar/python3/3.6.0/Frameworks/Python.framework/Versions/3.6/lib/python3.6', 
 '/Users/sunqingyao/Envs/django_test/lib/python3.6/site-packages'] 
Server time:    Tue, 28 Mar 2017 13:12:09 +0800 

我应该将 search_fields 设置为什么值?

请您参考如下方法:

检查 search_fields文档,如那里所述

These fields should be some kind of text field, such as CharField or TextField. You can also perform a related lookup on a ForeignKey or ManyToManyField with the lookup API “follow” notation:

search_fields = ['foreign_key__related_fieldname'] 

所以在你的情况下

search_fields = ['identity__username'] 

另请注意,它并没有说您可以像最初尝试的那样使用计算属性