2014-05-19 11 views
9

mam dwa modeleDjango REST ramy: Tworzenie/aktualizacja obiektu za pomocą dziedzinie pokrewnej

Auth modelu użytkownika i UserProfile

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

Dla których używam tych 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') 

But po wysłaniu prośby o wpisanie:

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

mam następujący obiekt z „null” profilu dziedzinie

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

nie jestem w stanie dowiedzieć się, jak osiągnąć tworzenie i updation z nazwą profilu użytkownika wraz z danymi użytkownika auth. Proszę dać mi znać, jak to zrobić i podać przykład tego samego.

Odpowiedz

1

Właściwie Django Rest Framework ma częściowe wsparcie zagnieżdżone. Jeśli spojrzysz na zestaw testów, znajdziesz go. Jeśli chodzi o bitewne pytanie, jak powiedział na IRC, powinno to zadziałać. Oto powiązany przypadek testowy: https://github.com/tomchristie/django-rest-framework/blob/2.3.13/rest_framework/tests/test_relations_nested.py#L56

Myśląc o tym, myślę, że raz miałem ten błąd. @bitgeeky Czy możesz upewnić się, że wysyłasz prośbę json, dodając typ zawartości do nagłówka? Domyślnie posty będą używały formularzy, które nie obsługują zagnieżdżonych.

7

Django REST Framework nie obsługuje zagnieżdżone pisze tak trzeba będzie stworzyć UserProfile nadrzędnymi create w ListCreateAPIView:

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) 

Korzystanie transaction.atomic będzie wycofać tworzenie profilu użytkownika, jeśli nie robi zapisać pomyślnie.

Edit

przypadku tworzenia nowego użytkownika będzie prawdopodobnie chcesz użyć create_user method. Powyższy kod miał pokazać ogólny przypadek utworzenia instancji modelu i powiązanego rekordu w jednym żądaniu POST interfejsu API REST.