2014-05-19 8 views
9

Ich habe zwei ModelleDjango REST Rahmen: erstellen/aktualisieren Objekt mit verwandtem Bereich

Auth User-Modell und Userprofile

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

Für welche ich diesen Serializer bin mit:

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') 

Aber wenn eine Postanfrage gestellt wird

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

bekomme ich folgendes Objekt mit einem „Null“ Profilfeld

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

ich nicht in der Lage bin, um herauszufinden, wie die Schöpfung und updation von Benutzerprofilnamen zusammen mit Auth Benutzerdaten zu erreichen. Bitte lassen Sie mich wissen, wie dies zu tun ist und ein Beispiel für das gleiche bereitstellen.

Antwort

1

Eigentlich Django Rest Framework hat eine teilweise verschachtelte Unterstützung. Wenn Sie sich die Testsuite ansehen, werden Sie einige finden. Wie für bitgeeky Frage, wie im IRC gesagt, sollte dies funktionieren. Hier ist ein zugehöriger Testfall: https://github.com/tomchristie/django-rest-framework/blob/2.3.13/rest_framework/tests/test_relations_nested.py#L56

Nachdenken darüber, ich denke, ich hatte diesen Fehler einmal. @bitgeeky können Sie sicherstellen, dass Sie eine JSON-Anfrage senden, indem Sie den Inhaltstyp in der Kopfzeile hinzufügen? Standardmäßig verwenden Posts Formulare, die geschachtelt nicht unterstützen.

7

Django REST-Framework unterstützt derzeit keine verschachtelten schreibt unterstützen, so dass Sie die Userprofile erstellen müssen durch zwingende create in einem 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) 

transaction.atomic verwendet, wird der Benutzererstellung Rollback, wenn das Profil nicht der Fall ist Erfolgreich gespeichert.

bearbeiten

Wenn Sie einen neuen Benutzer erstellen Sie wahrscheinlich die create_user method nutzen wollen. Der obige Code sollte den allgemeinen Fall der Erstellung einer Modellinstanz und eines zugehörigen Datensatzes in einer REST-API-POST-Anforderung zeigen.

Verwandte Themen