2016-02-05 17 views
9

私はアプリケーション内で、私は会社内でアクセストークンを共有しようとしています。例:地元のオフィスは、本社のトークンを使用してFacebookページに何かを投稿することができます。 FacebookやTwitterなどのソーシャルメディアサイトは、その私が作った独自の方法と抽象クラスAccessTokenにアクセストークンを扱うので、Django:GenericForeignKeyとunique_together

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 

。各サイトは独自のクラスを取得します。

class FacebookAccessToken(AccessToken): 
    # class stuff 

は、いくつかの読み取りを行った後、私はAccessTokenを継承するクラスを指すようにGenericForeignKeyを使用しなければならないことが分かりました。私は次のエラーを取得するジャンゴテストサーバーで実行すると

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')) 

:私はこのエラーを取得する理由

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を使用して、初めて私は、次のクラスを作りました。私は間違って何をしていますか?

アクセストークンをよりスマートに共有する方法があれば、それについて聞きたいと思います。

答えて

11

この状況で汎用外部キーを使用するのは正しいです。

ご使用のモデルのunique_together宣言に誤りがあります。 unique_togetherは、データベースに存在する列でのみ使用できます。 contentObjectは実際の列ではないので、Djangoは制約について不平を言います。

代わりに、次の操作を実行できます。

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

contentObjectが舞台裏contentTypecontentIdの本当にただ組み合わせたものであるので、これは、あなたの質問に定義されていたものと同じです。

+0

ありがとうございました。 – CyberFly

+0

あなたは 'contentId'ではなく' objectId'を意味すると思います。 –

関連する問題