Django: GenericForeignKey和unique_together

16

在我正在处理的应用程序中,我试图在公司内共享访问令牌。例如:本地办公室可以使用总部的令牌在其Facebook页面上发布内容。

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和其他社交媒体网站以自己的方式处理访问令牌,因此我创建了一个抽象类AccessToken。每个网站都有自己的类,例如

class FacebookAccessToken(AccessToken):
    # class stuff

经过一些阅读后,我发现必须使用GenericForeignKey指向继承AccessToken的类。 我创建了以下类:

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。我做错了什么吗?
如果有更聪明的分享访问令牌的方法,我很乐意听取建议。
1个回答

23

在这种情况下,您使用通用外键是正确的。

错误来自于您模型中的unique_together声明。 unique_together只能用于数据库中存在的列。由于contentObject不是实际的列,Django会抱怨约束条件。

相反,您可以执行以下操作:

unique_together = (('contentType', 'contentId', 'sharedWidth'),)

这与您在问题中定义的相同,因为contentObject实际上只是在幕后将contentTypecontentId组合在一起。


4
我认为你想说的是 objectId 而不是 contentId - Pablo M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接