簡體   English   中英

Django:GenericForeignKey和unique_together

[英]Django: GenericForeignKey and unique_together

在我正在處理的應用程序中,我正在嘗試在公司內共享訪問令牌。 示例:當地辦事處可以使用總部的代幣在其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'指的是字段'contentObject',它不是模型'ShareAccessToken'的本地。 提示:此問題可能是由多表繼承引起的。

我不明白為什么我第一次使用GenericForeignKey會出現此錯誤。 我究竟做錯了什么?

如果有一種更聰明的方式來分享訪問令牌,我很樂意聽到它。

在這種情況下使用通用外鍵是正確的。

錯誤來自您模型中的unique_together聲明。 unique_together只能與數據庫中存在的列一起使用。 由於contentObject不是真正的列,Django抱怨約束。

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

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

這相當於您在問題中定義的內容,因為contentObject實際上只是幕后的contentTypecontentId的組合。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM