2014-05-19 18 views
9

बनाएं/अपडेट वस्तु मैं दो मॉडलDjango बाकी ढांचा: संबंधित फील्ड

प्रमाणीकरण उपयोगकर्ता मॉडल और UserProfile

class UserProfile(models.Model): 
    user = models.OneToOneField(User, related_name='profile') 
    name = models.CharField(_lazy(u'Name'), max_length=255) 

जो के लिए मैं इन serializers का उपयोग कर रहा है:

from rest_framework import serializers 
from django.contrib.auth.models import User 

from oneanddone.users.models import UserProfile 

    class UserProfileSerializer(serializers.ModelSerializer): 

     class Meta: 
      model = UserProfile 
      fields = ('name',) 


    class UserSerializer(serializers.ModelSerializer): 
     profile = serializers.RelatedField() 

     class Meta: 
      model = User 
      fields = ('id', 'username', 'email', 'groups', 'profile') 

लेकिन एक पोस्ट अनुरोध

requests.post('http://localhost:8000/api/v1/users/', data={"username": "tester", "email": "[email protected]", "profile": [{"name":"testername"}]} ,headers={'Authorization':'Token d81e33c57b2d9471f4d6849bab3cb233b3b30468'}).text 

मैं एक "अशक्त" प्रोफाइल क्षेत्र

u'{"id": 10, "username": "tester", "email": "[email protected]", "groups": [], "profile": null}' 

मैं यह पता लगाने कैसे प्रमाणन उपयोगकर्ता डेटा के साथ उपयोगकर्ता प्रोफ़ाइल नाम के सृजन और अपडेशन को प्राप्त करने में सक्षम नहीं हूँ के साथ निम्न वस्तु मिलता है। कृपया मुझे बताएं कि यह कैसे करें और इसके लिए कुछ उदाहरण दें।

उत्तर

1

वास्तव में Django Rest Framework का आंशिक घोंसला समर्थन है। यदि आप टेस्ट सूट देखते हैं तो आपको कुछ मिल जाएगा। आईटीसी पर कहा गया है कि बिगगेकी सवाल के लिए, यह काम करना चाहिए। यहां एक संबंधित परीक्षण केस है: https://github.com/tomchristie/django-rest-framework/blob/2.3.13/rest_framework/tests/test_relations_nested.py#L56

इस बारे में सोचकर, मुझे लगता है कि मुझे यह त्रुटि एक बार थी। @bitgeeky क्या आप सुनिश्चित कर सकते हैं कि आप हेडर में सामग्री प्रकार जोड़कर एक जेसन अनुरोध भेज रहे हैं? डिफ़ॉल्ट पोस्ट द्वारा फॉर्म का उपयोग किया जाएगा जो नेस्टेड का समर्थन नहीं करते हैं।

7

Django बाकी फ्रेमवर्क वर्तमान में नेस्टेड लेखन का समर्थन नहीं करता है, तो आप एक ListCreateAPIView में create अधिभावी द्वारा UserProfile बनाना पड़ेगा:

class UserList(generics.ListCreateAPIView): 
    model = User 
    serializer_class = UserSerializer 

    def create(self, request, *args, **kwargs): 
     data = request.DATA 

     # note: transaction.atomic was introduced in Django 1.6 
     with transaction.atomic(): 
      user = User.(
       username=data['username'], 
       ... 
      ) 
      user.clean() 
      user.save() 

      UserProfile.objects.create(
       user=user, 
       name=data['profile']['name'] 
      ) 

     serializer = UserSerializer(user) 
     headers = self.get_success_headers(serializer.data) 

     return Response(serializer.data, status=status.HTTP_201_CREATED, 
         headers=headers) 

transaction.atomic का उपयोग उपयोगकर्ता निर्माण रोलबैक होगा यदि प्रोफ़ाइल नहीं है सफलतापूर्वक संचित करना।

संपादित

आप आप की संभावना create_user method उपयोग करना चाहते हैं जाएगा एक नया उपयोगकर्ता बना रहे हैं। ऊपर दिया गया कोड एक उदाहरण उदाहरण बनाने और एक आरईएसटी एपीआई पोस्ट अनुरोध में एक संबंधित रिकॉर्ड बनाने के सामान्य मामले को दिखाने का इरादा था।

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