2014-09-04 8 views
6

मेरे पास एक मॉडल है जो प्रबंधक में एक अलग निर्माण विधि का उपयोग करता है। मैं इस विधि को ओवरराइड कैसे करूं ताकि ListCreateAPIView में पोस्ट विधि डिफ़ॉल्ट विधि के बजाय मैंने जो विधि लिखा है उसका उपयोग करता है। विधि यहाँ है।django-rest-framework में डिफ़ॉल्ट निर्माण विधि को ओवरराइड करने के लिए कैसे करें

class WeddingInviteManager(models.Manager): 


def create(self, to_user, from_user, wedding): 
     wedding_invitation = self.create(from_user=from_user,to_user=to_user, 
             wedding=wedding) 
     notification.send([self.to_user], 'wedding_invite',{'invitation':wedding_invitation}) 

     return wedding_invitation 
+0

आप सेट कर रहे हैं मॉडल के ऑब्जेक्ट विशेषता में आपका प्रबंधक? इस तरह: https://docs.djangoproject.com/en/dev/topics/db/managers/#modifying-initial-manager-querysets – danielfranca

+0

हाँ मैं डिफॉल्ट मैनेजर को ओवरराइड कर रहा हूं जैसे कि दस्तावेज़ों को छोड़कर मेरा ऑब्जेक्ट कहलाता है । – zacmwa

उत्तर

4

मुझे लगता है कि वास्तव में अधिसूचना प्रणाली करने का कारण है।

मैं इस बजाय की तरह कुछ कर रही सिफारिश करेंगे:

class MyModel(models.Model): 
    ... 
    def save(self, silent=False, *args, **kwargs): 
     # Send notification if this is a new instance that has not been saved 
     # before: 
     if not silent and not self.pk: 
      notification.send([self.to_user], 'wedding_invite', {'invitation': self}) 

     return super(MyModel, self).save(*args, **kwargs) 

लेकिन अगर आप चाहिए, यह है (सिद्धांत में) तुम कैसे करते (कोड का परीक्षण नहीं):

from rest_framework import serializers, viewsets 

class MyModelSerializer(serializers.ModelSerializer): 
    def save_object(self, obj, **kwargs): 
     """ 
     Save the deserialized object. 
     """ 
     if getattr(obj, '_nested_forward_relations', None): 
      # Nested relationships need to be saved before we can save the 
      # parent instance. 
      for field_name, sub_object in obj._nested_forward_relations.items(): 
       if sub_object: 
        self.save_object(sub_object) 
       setattr(obj, field_name, sub_object) 

     ##### EDITED CODE ##### 
     if obj.pk: 
      obj.save(**kwargs) 
     else: 
      # Creating a new object. This is silly. 
      obj = MyModel.objects.create(obj.to_user, obj.from_user, obj.wedding) 
     ##### /EDITED CODE ##### 

     if getattr(obj, '_m2m_data', None): 
      for accessor_name, object_list in obj._m2m_data.items(): 
       setattr(obj, accessor_name, object_list) 
      del(obj._m2m_data) 

     if getattr(obj, '_related_data', None): 
      related_fields = dict([ 
       (field.get_accessor_name(), field) 
       for field, model 
       in obj._meta.get_all_related_objects_with_model() 
      ]) 
      for accessor_name, related in obj._related_data.items(): 
       if isinstance(related, RelationsList): 
        # Nested reverse fk relationship 
        for related_item in related: 
         fk_field = related_fields[accessor_name].field.name 
         setattr(related_item, fk_field, obj) 
         self.save_object(related_item) 

        # Delete any removed objects 
        if related._deleted: 
         [self.delete_object(item) for item in related._deleted] 

       elif isinstance(related, models.Model): 
        # Nested reverse one-one relationship 
        fk_field = obj._meta.get_field_by_name(accessor_name)[0].field.name 
        setattr(related, fk_field, obj) 
        self.save_object(related) 
       else: 
        # Reverse FK or reverse one-one 
        setattr(obj, accessor_name, related) 
      del(obj._related_data) 


class MyModelViewSet(viewsets.ModelViewSet): 
    serializer_class = MyModelSerializer 
    queryset = MyModel.objects.all() 
+0

आप किस दृष्टिकोण के लिए गए थे? – demux

+1

मैंने सहेजने की विधि को ओवरराइड करने का निर्णय लिया है। सुझाव के लिए धन्यवाद। यह बहुत आसान था क्योंकि मैं दस्तावेज़ पढ़ सकता था। – zacmwa

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