20

मैंने कई बार सामग्री प्रकार के ढांचे के बारे में Django दस्तावेज़ों पर चित्रित किया है, और मैं बस अपनी परियोजना में सामान्य संबंधों को लागू करने के लिए पर्याप्त रूप से समझ नहीं पा रहा हूं। मैंने इस मामले के बारे में ऑनलाइन उदाहरण या ट्यूटोरियल की तलाश की है, लेकिन मुझे एक भी नहीं मिल रहा है। मुझे मूर्ख कहो, लेकिन मुझे इस पर कुछ मदद की ज़रूरत है (कृपया दस्तावेज़ों से बस लिंक करके जवाब न दें)। ऑनलाइन संसाधनों की कमी के आधार पर, मेरा मानना ​​है कि यदि आप इस प्रश्न का पूरी तरह से उदाहरण देते हैं, तो आपका उत्तर django सामान्य संबंधों (बोनस!) के संबंध में आज तक का सबसे उपयोगी उदाहरण हो सकता है।Django: सामग्री प्रकार ढांचे का उपयोग कर जेनेरिक संबंधों का उदाहरण?

तो, मेरा सवाल यह है कि: क्या कोई मॉडल का एक साधारण उदाहरण दिखा सकता है और शायद कोड की कुछ पंक्तियां दिखाती हैं कि एक सामान्य मॉडल के उदाहरणों के साथ कैसे बातचीत करें?

एक साइट मीडिया आइटम है कि मोटे तौर पर ही इलाज कर रहे हैं है, लेकिन थोड़ा अलग हैं:


प्रेरणा के रूप में, यहाँ मैं क्या मानना ​​है कि एक बहुत ही आम स्थिति होगी। उदाहरण के लिए, मान लें कि छवि और वीडियो आइटम हैं, और उपयोगकर्ता किसी आइटम पर "आइटम" या "टिप्पणी" कर सकते हैं। पसंद और टिप्पणियों का इलाज समान होना चाहिए, भले ही उन्हें किसी छवि या वीडियो आइटम पर पोस्ट किया गया हो। इसलिए, यदि किसी उपयोगकर्ता के एल्बम में कोई छवि या वीडियो देखने के लिए कोई आइटम व्यू है, तो निम्न प्रकार की कॉल संभव होगी: mediaitem.comments.all() या len(mediaitem.likes.all()) या comment.user_who_commented, यह जानने के बिना कि यह किस प्रकार का मीडिया आइटम है (छवि या वीडियो) ।

मेरा मानना ​​है कि आप छह मॉडलों की आवश्यकता होगी इस के लिए:

  • सार MediaItem वर्ग
  • दो मीडिया आइटम के विभिन्न प्रकार: ImageItem और VideoItem
  • सार MediaItemActions वर्ग
  • दो अलग मीडिया आइटमों के लिए किए जा सकने वाले कार्यों के प्रकार: Like और Comment

क्या आप जानते हैं कि यह कैसे Django सुविधा का उपयोग करने, तो कृपया हमें एक पूर्ण उदाहरण दिखाते हैं! मुझे लगता है कि यह एक बेहद शक्तिशाली उपकरण होगा और मैं अपने आवेदन में इसका उपयोग करने के लिए चिंतित हूं। अधिक स्पष्ट, बेहतर।

उत्तर

5

आपका उपयोग केस Django comments framework (अब बहिष्कृत) के समान लगता है। यदि आप models देखें, तो आप देखेंगे कि BaseCommentAbstractModel में सामान्य संबंध का उपयोग कैसे करें - नोट करें कि आपको सभी तीन फ़ील्ड, ForeignKey से ContentType की आवश्यकता है, ऑब्जेक्ट्स 'pk एस, और GenericForeignKey फ़ील्ड को रखने के लिए एक फ़ील्ड।

GenericForeignKey द्वारा ऑब्जेक्ट्स के लिए क्वेरी करने के तरीके के रूप में, आप उस प्रोजेक्ट में template tags में कुछ उदाहरण देख सकते हैं। उदाहरण के लिए get_query_set विधि BaseCommentNode में देखें, जो लक्ष्य वस्तु के सामग्री प्रकार और पीके पर पूछताछ करके टिप्पणियां पुनर्प्राप्त करता है।

def get_query_set(self, context): 
    ctype, object_pk = self.get_target_ctype_pk(context) 
    if not object_pk: 
     return self.comment_model.objects.none() 

    qs = self.comment_model.objects.filter(
     content_type = ctype, 
     object_pk = smart_text(object_pk), 
     site__pk  = settings.SITE_ID, 
    ) 
1

एक और विकल्प Polymorphic Models है। मैं नहीं कहूंगा कि आपको जिस तरह से जाना चाहिए, लेकिन यह शायद एक विकल्प हो सकता है।

मैं सामान्य जेनेरिक विदेशी कुंजी और पॉलीमोर्फिक मॉडल दोनों का प्रशंसक हूं। पॉलीमोर्फिक मॉडल उन परिदृश्यों में सबसे अच्छा काम करते हैं जहां मॉडल में बहुत समानता होती है।

3

मेरे पास वास्तव में विभिन्न मीडिया प्रकारों के साथ मेरी परियोजनाओं में से एक पर एक जैसी ही स्थिति है।

class TaggedItem(models.Model): 
    tag = models.SlugField() 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

class ReviewedItem(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 
    review = models.ForeignKey("Review") 

class CreativeWork(models.Model): 
    #other fields 
    keywords = generic.GenericRelation("TaggedItem",null=True, blank=True, default=None) 
    reviews = generic.GenericRelation("ReviewedItem",null=True, blank=True, default=None) 

class MediaObject(CreativeWork): 
    #fields 
class VideoObject(MediaObject): 
    #fields 
class AudioObject(MediaObject): 
    #fields 

हर वीडियो या ऑडियो एक MediaObject है, जो एक CreativeWork है। क्रिएटिव वर्क्स में टैग और समीक्षाओं के लिए जेनेरिकरेलेशन है। तो अब कुछ भी टैग या समीक्षा की जा सकती है।

आपको सामग्री कार्रवाई के लिए विदेशी कुंजी रखने के लिए 'कार्रवाई' की आवश्यकता है। अपने मॉडल में जेनेरिकरेलेशन जोड़ने से पहले। मैं वास्तव में django.docs बहुत उपयोगी होने के लिए पाया :) लेकिन अगर उम्मीद नहीं है कि यह मदद करता है।

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