我正在尝试使用泛型关系,我的模型看起来像这样:
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,user_id
当我在content_type
上明确命名resource_type
时,为什么要查找GenericForeignKey
?
答案 0 :(得分:3)
我现在无法在文档中的任何位置看到它,但如果您查看GenericRelation
的来源,则在创建content_type_field
和object_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
答案 1 :(得分:0)
您是否有使用'资源'的具体原因?而不是'内容' /'对象' ?
如果没有,我建议改变与这样的通用关系相关的所有3行(以及Meta):
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content = GenericForeignKey('content_type', 'object_id')
我总是坚持使用这些字段名称来表示通用关系(基于the documentation),即使文档提到了重命名' content_type'和' object_id' (也许只有'内容'必须保持不变......)。我在Django中不够好解释为什么会这样做。
希望它是可行的,适用于您的项目