2016-02-05 22 views
9

Çalıştığım uygulamada, şirket içindeki erişim belirteçlerini paylaşmaya çalışıyorum. Örnek: Bir yerel ofis, Facebook sayfasındaki bir şeyi yayınlamak için merkezin jetonlarını kullanabilir.Django: GenericForeignKey ve 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 

Facebook, Twitter ve diğer sosyal medya siteleri kendi yaptığım kendi yolunu ve soyut sınıfta AccessToken erişim belirteçleri ele beri. Her site kendi sınıfını ör. Ben AccessToken miras sınıfları göstermek için bir GenericForeignKey kullanması gerektiğini öğrendim biraz okuma yaptıktan sonra

class FacebookAccessToken(AccessToken): 
    # class stuff 

. Ben aşağıdaki hatayı alıyorum Django sınama sunucusuna çalıştırdığınızda

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

: bu hatayı alıyorum neden

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.

anlamıyorum GenericForeignKey kullanarak, ilk kez aşağıdaki sınıfını yaptı. Neyi yanlış yapıyorum?

Erişim belirteçlerini paylaşmanın daha akıllı bir yolu varsa, bunu duymayı çok isterim.

cevap

11

Bu durumda genel yabancı anahtar kullanmanız doğrudur.

Buradaki hata, modelinizde bulunan unique_together beyannamenizden kaynaklanmaktadır. unique_together sadece veritabanında bulunan sütunlarla kullanılabilir. contentObject gerçek bir sütun olmadığından, Django kısıtlama konusunda şikayetçidir.

Bunun yerine, aşağıdakileri yapabilirsiniz:

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

contentObject perde arkasında contentType ve contentId gerçekten sadece kombinasyonu olduğu için bu sorunuzun tanımlanan ne olduğunu eşdeğerdir.

+0

Cevabınız için teşekkür ederiz. – CyberFly

+0

"contentId" yerine "objectId" kastettiğinizi düşünüyorum. –