【问题标题】:Django: Cannot resolve keyword '' into field. Choices are:Django:无法将关键字“”解析为字段。选择是:
【发布时间】:2014-04-15 06:49:07
【问题描述】:

我在访问 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() 时,我收到Cannot resolve keyword '' into field. Choices are:... 错误。

URL.objects.get(pk=1).tags.all(), URL.objects.get(pk=1).userURL.objects.filter(likes=auser, pk=1) 工作正常。

更新:

  1. likesdis_likes 字段是使用 southschemamigration 添加的
  2. 之前我用Django 1.6.1,更新为Django 1.6.2,问题依旧
  3. 已截断数据库,将其同步为新表,但问题仍然存在
  4. 部分回溯:

    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
    

【问题讨论】:

  • 无法在 1.6.2 上重现,URL.objects.get(pk=...).likes.all() 按预期工作。您的数据库模式是否与您的模型定义保持同步?你运行的是哪个 Django 版本?
  • @lanzz 是的,数据库模式是最新的模型定义,我用南添加喜欢和不喜欢。我正在使用 Django 1.6
  • 你能提供完整的回溯吗?
  • @lanzz 我已经发布了部分回溯
  • 请发布完整回溯。您得到的FieldError 异常似乎与URL 实例无关,而是与User 实例有关。

标签: python django manytomanyfield


【解决方案1】:

我想我找到了问题所在。我想问题出在我的应用程序名称__app__ 上。 Django 字段查找假定 __(双下划线) 之前的所有内容都是在我的情况下解析为 ``(空字符串) 的字段。

总是很难命名默认应用程序及其所在的项目。认为__app__ 是更pythonic 和更聪明的解决方案。我想我应该将我的应用程序重命名为 app。希望这行得通。

【讨论】:

  • __app__ 不是一个好主意,原因有很多;以__ 开头的实例属性将为mangled by the Python interpreter;文档通常不鼓励使用自定义 __*__ 标识符。
【解决方案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' 作为字段名称并获得我正在寻找的结果。

【讨论】:

    猜你喜欢
    • 2017-11-08
    • 2016-05-10
    • 1970-01-01
    • 2021-09-17
    • 1970-01-01
    • 2021-11-18
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多