Create () argument after ** muss ein Mapping sein, nicht Unicode

Ich versuche, ein verschachteltes Schreiben mit dem folgenden Serializer zu machen –

class UserProfileSerializer(serializers.ModelSerializer): class Meta: model = UserProfile fields = ('company', 'is_admin', 'last_modified', 'uuid') class UserSerializer(serializers.ModelSerializer): profile = UserProfileSerializer() class Meta: model = User fields = ('url', 'username', 'email', 'profile') def create(self, validated_data): profile_data = validated_data.pop('profile') user = User.objects.create(**validated_data) for profile_data in profile_data: UserProfile.objects.create(user=user, **profile_data) return user 

Aber nach einem Beitrag bekomme ich folgendes Traceback –

  • Verwenden von dateadd in django filter
  • Bereits registriert bei / appname /: Der Modellbenutzer ist bereits registriert
  • Python_2_unicode_kompatibler Fehler
  • Zugriff auf Daten von einer verwandten Klasse in Django
  • Django HTTPS-Einstellungen: Warum setzt SESSION_SAVE_EVERY_REQUEST und SESSION_COOKIE_SECURE die Sessions ein?
  • Verwenden von PIL zum automatischen Drehen des Bildes mit Handy und Accelorometer
  •  Traceback: File "/opt/enterpass_app/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 132. response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/opt/enterpass_app/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 58. return view_func(*args, **kwargs) File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/viewsets.py" in view 87. return self.dispatch(request, *args, **kwargs) File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 466. response = self.handle_exception(exc) File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/views.py" in dispatch 463. response = handler(request, *args, **kwargs) File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/mixins.py" in create 21. self.perform_create(serializer) File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/mixins.py" in perform_create 26. serializer.save() File "/opt/enterpass_app/lib/python2.7/site-packages/rest_framework/serializers.py" in save 180. self.instance = self.create(validated_data) File "/opt/enterpass/core/serializers.py" in create 20. UserProfile.objects.create(user=user, **profile_data) Exception Type: TypeError at /api/users/ Exception Value: create() argument after ** must be a mapping, not unicode 

    Ich folge der Dokumentation hier http://www.django-rest-framework.org/api-guide/relations/#writable-nested-serializers verbatim so nicht sicher, was ich vermisse. Möglicherweise mache ich ein OneToOneField auf dem User nicht ein ForeignKey wie das Beispiel?

    Bearbeiten – möchte hinzufügen, dass, obwohl ich die oben genannten Traceback bekomme es immer noch auf Benutzer aber nicht auf Benutzerprofil.

    One Solution collect form web for “Create () argument after ** muss ein Mapping sein, nicht Unicode”

    Für alle, die eine OneToOne Mapping auf einen Schlüssel machen, ist dies der richtige Code –

     class UserProfileSerializer(serializers.ModelSerializer): class Meta: model = UserProfile fields = ('company', 'is_admin', 'last_modified', 'uuid') class UserSerializer(serializers.ModelSerializer): profile = UserProfileSerializer() class Meta: model = User fields = ('url', 'username', 'email', 'profile') def create(self, validated_data): profile_data = validated_data.pop('profile') user = User.objects.create(**validated_data) UserProfile.objects.create(user=user, **profile_data) return user 

    Beachten Sie, dass for profile_data in profile_data: folgendes entfernt for profile_data in profile_data:

    Grund dafür gibt es nicht mehrere Werte.

    Python ist die beste Programmiersprache der Welt.