3

ich die Standard-User-Modell zu ExtendedUser erweitert:Django - 00.59 Serializer erstellen Funktion

from django.db import models 
from django.contrib.auth.models import User 

class ExtendedUser(models.Model): 
    user = models.OneToOneField(User, on_delete=models.CASCADE) 
    shirt_size = models.CharField(max_length=2) 

Benutzer Serializer:

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


class UserSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = User 
     fields = ('url', 'username', 'email', 'groups', 'is_staff') 

ExtendedUser Serializer:

from api.resources.users.models.extended_user import ExtendedUser 
from rest_framework import serializers 
from django.contrib.auth.models import User 
from api.resources.users.serializers.user import UserSerializer 


class ExtendedUserSerializer(serializers.HyperlinkedModelSerializer): 
    user = UserSerializer(read_only=False) 

    class Meta: 
     model = ExtendedUser 
     fields = ('url', 'shirt_size', 'user') 

    def create(self, validated_data): 
     user_data = validated_data.pop('user') 
     user = User.objects.create(**user_data) 
     return ExtendedUser.objects.create(user=user, **validated_data) 

Das Hauptergebnis sollte sein, dass beim Einreichen eines neuen ExtendedUsers auch ein Benutzer mit Eins-zu-Eins-Relation erstellt wird.

Aber ich bin immer diese Fehlermeldung:

User: myusername needs to have a value for field "user" before this many-to-many relationship can be used.

Traceback:

Environment: 


Request Method: POST 
Request URL: http://localhost:8000/users/ 

Django Version: 1.10.4 
Python Version: 2.7.12 
Installed Applications: 
['django.contrib.admin', 
'django.contrib.auth', 
'django.contrib.contenttypes', 
'django.contrib.sessions', 
'django.contrib.messages', 
'django.contrib.staticfiles', 
'rest_framework', 
'api'] 
Installed Middleware: 
['django.middleware.security.SecurityMiddleware', 
'django.contrib.sessions.middleware.SessionMiddleware', 
'django.middleware.common.CommonMiddleware', 
'django.middleware.csrf.CsrfViewMiddleware', 
'django.contrib.auth.middleware.AuthenticationMiddleware', 
'django.contrib.messages.middleware.MessageMiddleware', 
'django.middleware.clickjacking.XFrameOptionsMiddleware'] 



Traceback: 

File "C:\Python27\lib\site-packages\django\core\handlers\exception.py" in inner 
    39.    response = get_response(request) 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response 
    187.     response = self.process_exception_by_middleware(e, request) 

File "C:\Python27\lib\site-packages\django\core\handlers\base.py" in _get_response 
    185.     response = wrapped_callback(request, *callback_args, **callback_kwargs) 

File "C:\Python27\lib\site-packages\django\views\decorators\csrf.py" in wrapped_view 
    58.   return view_func(*args, **kwargs) 

File "C:\Python27\lib\site-packages\rest_framework\viewsets.py" in view 
    83.    return self.dispatch(request, *args, **kwargs) 

File "C:\Python27\lib\site-packages\rest_framework\views.py" in dispatch 
    477.    response = self.handle_exception(exc) 

File "C:\Python27\lib\site-packages\rest_framework\views.py" in handle_exception 
    437.    self.raise_uncaught_exception(exc) 

File "C:\Python27\lib\site-packages\rest_framework\views.py" in dispatch 
    474.    response = handler(request, *args, **kwargs) 

File "C:\Python27\lib\site-packages\rest_framework\mixins.py" in create 
    21.   self.perform_create(serializer) 

File "C:\Python27\lib\site-packages\rest_framework\mixins.py" in perform_create 
    26.   serializer.save() 

File "C:\Python27\lib\site-packages\rest_framework\serializers.py" in save 
    214.    self.instance = self.create(validated_data) 

File "C:/Users/ozbar/PycharmProjects/usnccm/usnccm-api\api\resources\users\serializers\extended_user.py" in create 
    15.   user = User.objects.create(**user_data) 

File "C:\Python27\lib\site-packages\django\db\models\manager.py" in manager_method 
    85.     return getattr(self.get_queryset(), name)(*args, **kwargs) 

File "C:\Python27\lib\site-packages\django\db\models\query.py" in create 
    397.   obj = self.model(**kwargs) 

File "C:\Python27\lib\site-packages\django\contrib\auth\base_user.py" in __init__ 
    68.   super(AbstractBaseUser, self).__init__(*args, **kwargs) 

File "C:\Python27\lib\site-packages\django\db\models\base.py" in __init__ 
    550.        setattr(self, prop, kwargs[prop]) 

File "C:\Python27\lib\site-packages\django\db\models\fields\related_descriptors.py" in __set__ 
    499.   manager = self.__get__(instance) 

File "C:\Python27\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__ 
    476.   return self.related_manager_cls(instance) 

File "C:\Python27\lib\site-packages\django\db\models\fields\related_descriptors.py" in __init__ 
    783.         (instance, self.source_field_name)) 

Exception Type: ValueError at /users/ 
Exception Value: "<User: oz>" needs to have a value for field "user" before this many-to-many relationship can be used. 

Validated_data object`s Wert auf POST über django-Rest Webansicht:

{u'user': OrderedDict([(u'username', u'oz'), (u'email', u'[email protected]'), (u'groups', []), (u'is_staff', True)]), u'shirt_size': u'm'} 
+0

Konnten Sie die komplette Rückverfolgung posten? – lucasnadalutti

+0

Ja, ich habe gerade hinzugefügt –

+0

Hm, dieser Fehler ist wirklich seltsam und sollte nicht in einer OneToOne-Beziehung ausgelöst werden. Sind Sie sicher, dass dies das vollständige 'ExtendedUser'-Modell ist und alle Migrationen ausgeführt werden? Könnten Sie 'valided_data' so drucken, wie es von der' create' Methode empfangen wurde, und es auch hier veröffentlichen? – lucasnadalutti

Antwort

1

Okay for Starter, das Problem hat nichts mit Django-Rest-Framework oder Ihrer Python-Version zu tun.

Es scheint ein Problem mit django == 1.10 als ich einfach versucht, zu sein:

User.objects.create(user="hello", email="[email protected]", groups=[], is_staff=False)

in Djangos shell und erhalten exakt die gleichen Fehler. Wenn wir jedoch neuere Versionen von django ausprobieren, bleibt das Problem bestehen.

Ich habe bemerkt, dass, wenn django diesen Befehl installieren:

pip install django

Es django==1.10 und nicht die neueste Version installieren. Wenn Sie versehentlich diese ältere Version installiert ist, schlage ich django deinstallieren und dann die neueste Version installieren:

pip uninstall django
pip install django==1.9.12

Wenn django==1.9.12 verwenden, müssen Sie groups vollständig von Ihrem UserSerializer zu entfernen und es nicht schaffen, wenn Tun Sie Ihre POST.

Verwandte Themen