Django:无法将关键字''解析为字段。可选项有:
我遇到了一个奇怪的问题,无法访问 ManyToManyField
。
我有以下这些模型。
class Link(models.Model):
title = models.CharField(max_length = 200)
url = models.URLField(unique = True)
tags = models.ManyToManyField(Tag)
creation_date = models.DateTimeField(auto_now_add = True)
user = models.ForeignKey(User)
likes = models.ManyToManyField(User, related_name = "%(app_label)s_%(class)s_user_likes")
dis_likes = models.ManyToManyField(User, related_name = "%(app_label)s_%(class)s_user_dis_likes")
class Meta:
abstract = True
class URL(Link):
preview_image = models.URLField()
preview_heading = models.CharField(max_length = 100)
preview_content = models.CharField(max_length = 100)
当我尝试使用 URL.objects.get(pk=1).likes.all()
时,出现了 无法将关键字 '' 解析为字段。可选项有:...
的错误。
但是 URL.objects.get(pk=1).tags.all()
、URL.objects.get(pk=1).user
和 URL.objects.filter(likes=auser, pk=1)
都能正常工作。
更新内容:
- 字段
likes
和dis_likes
是通过south
和schemamigration
添加的。 - 之前我使用的是
Django 1.6.1
,更新到Django 1.6.2
后,问题依然存在。 - 我清空了数据库,并同步以创建新的表,问题还是没有解决。
部分错误追踪信息:
File "F:\system\env\lib\site-packages\django\db\models\manager.py" in all 133. return self.get_queryset() File "F:\system\env\lib\site-packages\django\db\models\fields\related.py" in get_queryset 549. return super(ManyRelatedManager, self).get_queryset().using(db)._next_is_sticky().filter(**self.core_filters) File "F:\system\env\lib\site-packages\django\db\models\query.py" in filter 590. return self._filter_or_exclude(False, *args, **kwargs) File "F:\system\env\lib\site-packages\django\db\models\query.py" in _filter_or_exclude 608. clone.query.add_q(Q(*args, **kwargs)) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in add_q 1198. clause = self._add_q(where_part, used_aliases) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in _add_q 1234. current_negated=current_negated) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in build_filter 1100. allow_explicit_fk=True) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in setup_joins 1357. names, opts, allow_many, allow_explicit_fk) File "F:\system\env\lib\site-packages\django\db\models\sql\query.py" in names_to_path 1277. "Choices are: %s" % (name, ", ".join(available))) Exception Type: FieldError at /url/3 Exception Value: Cannot resolve keyword '' into field. Choices are: __app___article_user_dis_likes, __app___article_user_likes, __app___imageurl_user_dis_likes, __app___imageurl_user_likes, __app___review_user_dis_likes, __app___review_user_likes, __app___url_user_dis_likes, __app___url_user_likes, __app___videourl_user_dis_likes, __app___videourl_user_likes, article, date_joined, email, first_name, groups, id, imageurl, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, review, url, user_permissions, username, userobjectpermission, videourl
2 个回答
2
这种情况可能发生在你尝试在Django期望字段名称的地方使用 __unicode__
或 __str__
的时候。在我的例子中,我想使用 __unicode__
,因为我给我的模型添加了有意义的实现,并希望在表格的第一列中重复使用它。
为了解决这个问题,我添加了
class AdminBase(admin.ModelAdmin):
def natural_title(self, obj):
return unicode(obj)
natural_title.short_description = 'Title'
这里的 AdminBase
是我为管理类创建的自定义基类。现在我可以使用 'natural_title'
作为字段名称,并得到我想要的结果。
3
我想我找到了问题所在。问题可能出在我应用的名字上,叫做 __app__
。Django在查找字段的时候,会认为双下划线 __
前面的部分是一个字段,而在我的情况下,这个字段变成了``(空字符串)。
我一直很难给默认的应用和它所在的项目起个名字。我觉得 __app__
这个名字更符合Python的风格,也挺聪明的解决方案。不过我想我应该把我的应用改名为 app
。希望这样能解决问题。