Django

2011-10-20 7 views
18

में जेनेरिक एक-से-एक संबंध मुझे एक-से-एक संबंध स्थापित करने की आवश्यकता है जो सामान्य भी होनी चाहिए। हो सकता है कि आप मुझे एक बेहतर डिजाइन की सलाह दे सकें। अब तक मैं निम्नलिखित मॉडलDjango

class Event(models.Model): 
    # skip event related fields... 
    content_type  = models.ForeignKey(ContentType) 
    object_id   = models.PositiveIntegerField() 
    content_object = generic.GenericForeignKey('content_type', 'object_id') 

    class Meta: 
     unique_together = ('content_type', 'object_id') 

class Action1(models.Model): 
    # skip action1 related fields... 
    events = generic.GenericRelation(Event, content_type_field='content_type', object_id_field='object_id') 

    @property 
    def event(self): 
     return self.events.get() # <<<<<< Is this reasonable? 

class Action2(models.Model):... 

Django व्यवस्थापक के अंतर्गत घटना की सूची में मैं सभी कार्यों एकत्र करना चाहते हैं आया था, और वहाँ से मैं कार्यों के लिए व्यवस्थापक पृष्ठों के लिए जाना चाहते हैं। क्या एक्शन मॉडल में event संपत्ति बनाने से बचना संभव है? क्या कोई बेहतर समाधान है? एक ही परिभाषा में क्षेत्र events और संपत्ति event को गठबंधन करना अच्छा लगेगा। जिस परियोजना के साथ मैं काम कर रहा हूं, Django 1.1

+0

यदि आप वास्तव में 'ईवेंट' से बचना चाहते हैं, तो आपको नीचे दिए गए अनुसार, 'ईवेंट' तालिका मैन्युअल रूप से क्वेरी को कार्यान्वित करने की आवश्यकता होगी। मैं अभी भी जेनेरिकरेलेशन के रूप में 'ईवेंट' करना पसंद करूंगा और फिर 'event' प्रॉपर्टी में 'self.events.first()' का उपयोग करूंगा। इसके अलावा, यह भविष्य में आपको अद्वितीय बाधा को दूर करने की अनुमति देता है। – alexcasalboni

उत्तर

14

मैंने हाल ही में came across this problem का उपयोग किया है। तुमने क्या किया ठीक है, लेकिन यदि आप एक mixin उस रिश्ते को पारदर्शी रूप से उलट बनाकर थोड़ा और अधिक यह सामान्यीकरण कर सकते हैं:

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

    class Meta: 
     unique_together = ('content_type', 'object_id') 

class EventMixin(object): 
    @property 
    def get_event(self): 
     ctype = ContentType.objects.get_for_model(self.__class__) 
     try: 
      event = Event.objects.get(content_type__pk = ctype.id, object_id=self.id) 
     except: 
      return None 
     return event 

class Action1(EventMixin, models.Model): 
    # Don't need to mess up the models fields (make sure the mixing it placed before models.Model) 
    ... 

और

action = Action1.object.get(id=1) 
event = action.get_event 

आप रिवर्स करने के लिए कैशिंग जोड़ सकते हैं रिश्ते भी

+0

यह अच्छी तरह से काम करता है, लेकिन यह करने की क्षमता नहीं देता है: 'Action.objects.select_related (' event ') ' – ramusus

+0

मुझे यह समाधान पसंद नहीं है ->' जेनेरिकरेलेशन 'बहुत बेहतर दिखता है, भले ही आपको उपयोग करने की आवश्यकता हो 'self.events.get()' या 'self.events.first() ' – alexcasalboni

+0

उपरोक्त टिप्पणियों के समान। मूल रूप से 'जेनेरिकरेलेशन' के साथ आप क्या बेहतर थे। –