【问题标题】:Cannot resolve keyword 'content_type' into field无法将关键字“content_type”解析为字段
【发布时间】:2016-09-13 13:54:55
【问题描述】:

我正在尝试使用泛型关系,我的模型如下所示:

class Post(models.Model):
    # Identifiers
    user = models.ForeignKey(User, unique=False, related_name = 'posts')
    # Resource
    resource_type = models.ForeignKey(ContentType)
    resource_id = models.PositiveIntegerField()
    resource = GenericForeignKey('resource_type', 'resource_id')

    # Other
    date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True)

    class Meta:
         unique_together = ('resource_type', 'resource_id',)

但是,当我在我的资源上尝试获取 Post 对象时,使用“SomeResource.posts”会发生以下异常:

无法将关键字“content_type”解析为字段。选择是: date_created、id、resource、resource_id、resource_type、 resource_type_id, 用户, user_id

当我在我的GenericForeignKey 上明确将其命名为resource_type 时,它为什么要查找content_type

【问题讨论】:

    标签: django


    【解决方案1】:

    我现在在文档中的任何地方都看不到它,但是如果您查看 GenericRelation 的源代码,则在创建它时会发现 content_type_fieldobject_id_field 的关键字。因此,如果您将关系创建为GenericRelation(object_id_field='resource_id', content_type_field='resource_type'),那么它应该寻找正确的字段。

    我发现如果您在单个模型中有多个 GenericForeignKey's 并因此无法使用默认名称,则这尤其必要。

    您可以在此处查看 1.11 的源代码:https://github.com/django/django/blob/stable/1.11.x/django/contrib/contenttypes/fields.py#L291

    【讨论】:

    • 是的,这为我解决了同样的问题。我看到两种方法:A.) 在定义 GenericForeignKey 的模型中,它应该坚持默认名称content_typeobject_idcontent_object,然后它无需额外步骤即可工作或 B.) 如果在定义 GenericForeignKey 的模型中使用了非默认名称,那么这些非默认名称必须在相关模型中明确说明,如您所描述的。
    【解决方案2】:

    你有使用“资源”而不是“内容”/“对象”的具体原因吗?

    如果没有,我建议更改与这样的通用关系相关的所有 3 行(以及 Meta):

     content_type = models.ForeignKey(ContentType)
     object_id = models.PositiveIntegerField()
     content = GenericForeignKey('content_type', 'object_id')
    

    我总是坚持使用这些字段名称来表示通用关系(基于the documentation),即使文档提到了重命名“content_type”和“object_id”的可能性(也许只有“content”必须保持不变...... )。我在 Django 中还不够好,无法解释这种行为的原因。

    希望它是可行的并适用于您的项目

    【讨论】:

    • 我想更改它们以提高可读性和统一性,因为我认为默认命名有点笨拙。
    • 这里link 如果您的问题与过滤对象有关,您可能会有答案......对不起,我无法提供更多帮助
    • 不抱歉,我的问题不在于过滤。它与检索通用对象有关。
    猜你喜欢
    • 2018-11-23
    • 2011-06-09
    • 2021-02-06
    • 1970-01-01
    • 2021-05-23
    • 2013-10-09
    • 2019-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多