2016-02-05 3 views
9

एप्लिकेशन में मैं काम कर रहा हूं मैं एक कंपनी के भीतर एक्सेस टोकन साझा करने की कोशिश कर रहा हूं। उदाहरण: एक स्थानीय कार्यालय अपने फेसबुक पेज पर कुछ पोस्ट करने के लिए मुख्यालय के टोकन का उपयोग कर सकता है।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 

के बाद से फेसबुक, ट्विटर और अन्य सामाजिक मीडिया साइटों अपने तरीके से मैंने बनाया और अमूर्त वर्ग AccessToken में पहुंच टोकन को संभाल। प्रत्येक साइट को अपनी कक्षा मिलती है उदा।

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

जब मैं 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 का उपयोग कर, मैं निम्नलिखित वर्ग बनाया है। मैं क्या गलत कर रहा हूं?

यदि एक्सेस टोकन साझा करने का कोई आसान तरीका है तो मुझे इसके बारे में सुनना अच्छा लगेगा।

उत्तर

11

इस स्थिति में सामान्य विदेशी कुंजी का आपका उपयोग सही है।

त्रुटि आपके मॉडल में आपके unique_together घोषणा से आ रही है। unique_together केवल डेटाबेस में मौजूद कॉलम के साथ उपयोग किया जा सकता है। चूंकि contentObject वास्तविक कॉलम नहीं है, इसलिए Django बाधा के बारे में शिकायत करता है।

इसके बजाय, आप निम्न कर सकते हैं:

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

यह है कि आप अपने प्रश्न में परिभाषित किया गया था के बराबर है क्योंकि contentObject वास्तव में सिर्फ contentType और परदे के पीछे contentId का संयोजन है।

+0

उत्तर के लिए धन्यवाद। – CyberFly

+0

मुझे लगता है कि आप 'contentId' के बजाय' objectId' का मतलब था। –

संबंधित मुद्दे