Django:GenericForeignKey 和 unique_together
Django: GenericForeignKey and unique_together
在我正在处理的应用程序中,我试图在公司内共享访问令牌。示例:当地办事处可以使用总部的代币在其 Facebook 页面上 post 某些内容。
class AccessToken(models.Model):
"""Abstract class for Access tokens."""
owner = models.ForeignKey('publish.Publisher')
socialMediaChannel = models.IntegerField(
choices=socialMediaChannelList, null=False, blank=False
)
lastUpdate = models.DateField(auto_now=True)
class Meta:
abstract = True
由于 Facebook、Twitter 和其他社交媒体网站以自己的方式处理访问令牌,因此我制作并抽象了 class AccessToken。每个站点都有自己的 class,例如
class FacebookAccessToken(AccessToken):
# class stuff
阅读之后我发现我必须使用 GenericForeignKey
来指向继承 AccessToken
的 classes。我做了以下 class:
class ShareAccessToken(models.Model):
"""Share access tokens with other publishers."""
sharedWith = models.ForeignKey('publish.Publisher')
sharedBy = models.ForeignKey(User)
# for foreignkey to abstract model's children
contentType = models.ForeignKey(ContentType)
objectId = models.PositiveIntegerField()
contentObject = GenericForeignKey('contentType', 'objectId')
class Meta:
unique_together = (('contentObject', 'sharedWith'))
当我 运行 django 测试服务器时,出现以下错误:
core.ShareAccessToken: (models.E016) 'unique_together' refers to field
'contentObject' which is not local to model 'ShareAccessToken'. HINT:
This issue may be caused by multi-table inheritance.
第一次使用 GenericForeignKey
,我不明白为什么会出现此错误。我做错了什么?
如果有更智能的方式来共享访问令牌,我很想听听。
您在这种情况下使用通用外键是正确的。
错误来自模型中的 unique_together
声明。 unique_together
只能用于数据库中存在的列。由于 contentObject
不是真正的列,Django 抱怨该约束。
相反,您可以执行以下操作:
unique_together = (('contentType', 'contentId', 'sharedWidth'),)
这等同于您在问题中定义的内容,因为 contentObject
实际上只是 contentType
和 contentId
在幕后的组合。
在我正在处理的应用程序中,我试图在公司内共享访问令牌。示例:当地办事处可以使用总部的代币在其 Facebook 页面上 post 某些内容。
class AccessToken(models.Model):
"""Abstract class for Access tokens."""
owner = models.ForeignKey('publish.Publisher')
socialMediaChannel = models.IntegerField(
choices=socialMediaChannelList, null=False, blank=False
)
lastUpdate = models.DateField(auto_now=True)
class Meta:
abstract = True
由于 Facebook、Twitter 和其他社交媒体网站以自己的方式处理访问令牌,因此我制作并抽象了 class AccessToken。每个站点都有自己的 class,例如
class FacebookAccessToken(AccessToken):
# class stuff
阅读之后我发现我必须使用 GenericForeignKey
来指向继承 AccessToken
的 classes。我做了以下 class:
class ShareAccessToken(models.Model):
"""Share access tokens with other publishers."""
sharedWith = models.ForeignKey('publish.Publisher')
sharedBy = models.ForeignKey(User)
# for foreignkey to abstract model's children
contentType = models.ForeignKey(ContentType)
objectId = models.PositiveIntegerField()
contentObject = GenericForeignKey('contentType', 'objectId')
class Meta:
unique_together = (('contentObject', 'sharedWith'))
当我 运行 django 测试服务器时,出现以下错误:
core.ShareAccessToken: (models.E016) 'unique_together' refers to field 'contentObject' which is not local to model 'ShareAccessToken'. HINT: This issue may be caused by multi-table inheritance.
第一次使用 GenericForeignKey
,我不明白为什么会出现此错误。我做错了什么?
如果有更智能的方式来共享访问令牌,我很想听听。
您在这种情况下使用通用外键是正确的。
错误来自模型中的 unique_together
声明。 unique_together
只能用于数据库中存在的列。由于 contentObject
不是真正的列,Django 抱怨该约束。
相反,您可以执行以下操作:
unique_together = (('contentType', 'contentId', 'sharedWidth'),)
这等同于您在问题中定义的内容,因为 contentObject
实际上只是 contentType
和 contentId
在幕后的组合。