2013-09-02 7 views
8

बनाने मैं उपयोगकर्ता के लिए एक विदेशी कुंजी (किताब के मालिक) के साथ एक पुस्तक मॉडल है:अतिरिक्त फ़ील्ड जोड़ने के लिए ModelViewSet जब

class Book(models.Model): 
    owner = models.ForiegnKey(User) 
    ... 

मैं एक ModelViewSet बना लिया है (और अधिक सुरक्षा के लिए

class BookViewSet(viewsets.ModelViewSet): 
    model = Book 
    serializer_class = BookSerializer 
    def get_queryset(self): 
     return Book.objects.filter(owner=self.request.user) 

अब एक नई किताब बनाने के लिए, मैं request.user साथ उपयोगकर्ता क्षेत्र को बचाने के लिए, बाकी ग्राहक से भेजे गए डेटा के साथ नहीं करना चाहता: पुस्तक के लिए जो उपयोगकर्ता के प्रवेश के स्वामित्व में पुस्तकों से पता चलता)। उदाहरण के लिए:

def create(self, request, *args, **kwargs): 
    request.DATA['user'] = request.user 
    ... (some code to create new Book from request.DATA using serialize class) 

लेकिन मैं यह त्रुटि आई: यह QueryDict उदाहरण अपरिवर्तनीय है। (मतलब है। डेटा एक अपरिवर्तनीय क्वेरी है और इसे बदला नहीं जा सकता है)

क्या आप डीजेंगो के बाकी ढांचे के साथ ऑब्जेक्ट बनाते समय अतिरिक्त फ़ील्ड जोड़ने का कोई बेहतर तरीका जानते हैं?

उत्तर

10

अद्यतन: चूंकि आप ऐसा करने की जरूरत v3:

def perform_create(self, serializer): 
    serializer.save(owner=self.request.user) 

सिद्धांत ही रहता है।


आप अपनी पुस्तक serializer की owner क्षेत्र केवल पढ़ने के लिए और उसके बाद pre_save() में उपयोगकर्ता के साथ मिलकर सेट बनाना चाहते हैं।

कुछ की तरह:

def pre_save(self, obj): 
    obj.owner = self.request.user 

tutorial section on "Associating Snippets with Users" देखें।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

मॉडलसेरियलाइज़र क्लास में केवल स्वामी को पढ़ने के लिए कैसे करें? – Ali

+0

बस read_only = True पास करें। Http://django-rest-framework.org/api-guide/fields देखें।एचटीएमएल # कोर-तर्क –

+0

मैं मॉडलसेरियलाइज़र का उपयोग करता हूं और फ़ील्ड मॉडल फ़ील्ड से स्पष्ट रूप से परिभाषित किए जाते हैं। – Ali

1

आप ModelSerializer उपयोग कर रहे हैं यह restore_object() विधि को लागू करने जितना आसान है:

class MySerializer(serializers.ModelSerializer): 

    def restore_object(self, attrs, instance=None): 

     create = not instance 
     instance = super(MySerializer, self).restore_object(attrs, instance) 

     if create: 
      instance.user = self.context['request'].user 

     return instance 

    # ... 

restore_object() एक वस्तु उदाहरण में विशेषताओं का एक शब्दकोश deserialize करने के लिए प्रयोग किया जाता है। ModelSerializerimplements this method और Meta कक्षा में निर्दिष्ट मॉडल के लिए उदाहरण बनाता है/अपडेट करता है। यदि दिया गया instanceNone है तो इसका मतलब है कि ऑब्जेक्ट अभी भी बनाया जाना है। इस मामले में आप वांछित मूल्य के साथ user फ़ील्ड सेट करें।

अधिक जानकारी: http://www.django-rest-framework.org/api-guide/serializers#declaring-serializers

6

क्या यह लायक है इस Django REST Framework 3 में बदल गया है के लिए। अब perform_create() है जो पुराने उत्तर में सुझाए गए पुराने pre_save() और post_save() हुक को प्रतिस्थापित करता है। उदाहरण के लिए:

from rest_framework import viewsets 

class MyViewSet(viewsets.ModelViewSet): 
    queryset = MyModel.objects.all() 
    serializer_class = MyModelSerializer 

    def perform_create(self, serializer): 
     serializer.save(owner=self.request.user) 

आशा है कि यह किसी को कुछ समय बचाएगा।

+1

बहुत बढ़िया। बस एक मामूली टाइपो, यह 'def perform_create (स्वयं, serializer) होना चाहिए: ' –

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