Python Django rest框架一对一关系更新序列化程序

Python Django rest框架一对一关系更新序列化程序,python,django,django-rest-framework,Python,Django,Django Rest Framework,我是Django Rest框架的初学者。我有一个长期的问题,我试图通过许多论坛找到解决方案,但不幸的是,我没有成功。希望你能帮助我 models.py from __future__ import unicode_literals from django.contrib.auth.models import User from django.db import models class Account(models.Model): my_user=models.OneToOneFie

我是Django Rest框架的初学者。我有一个长期的问题,我试图通过许多论坛找到解决方案,但不幸的是,我没有成功。希望你能帮助我

models.py

from __future__ import unicode_literals
from django.contrib.auth.models import User

from django.db import models

class Account(models.Model):
    my_user=models.OneToOneField(User,on_delete=models.CASCADE)
    statut=models.CharField(max_length=80)
    date=models.DateField(auto_now=True,auto_now_add=False)

    def __unicode__(self):

      return self.my_user.first_name
现在我想更新帐户序列器。 序列化程序.py

class AccountUpdateSerializer(serializers.ModelSerializer):


    username=serializers.CharField(source ='my_user.username')

    class Meta:

        model= Account
        fields=['id','username','statut','date']
        def update(self, instance, validated_data):
            print(instance)
            instance.statut = validated_data.get('statut', instance.statut)
            instance.my_user.username=validated_data['username']
            return instance
追溯: 环境:

Request Method: PUT
Request URL: http://127.0.0.1:9000/api/account/edit/1/

Django Version: 1.9
Python Version: 2.7.6
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'project',
 'sponsors',
 'contacts',
 'medias',
 'conferencier',
 'competition',
 'poste',
 'account']
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.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  149.                     response = self.process_exception_by_middleware(e, request)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
  147.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view
  58.         return view_func(*args, **kwargs)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/django/views/generic/base.py" in view
  68.             return self.dispatch(request, *args, **kwargs)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  474.             response = self.handle_exception(exc)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/views.py" in handle_exception
  434.             self.raise_uncaught_exception(exc)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/views.py" in dispatch
  471.             response = handler(request, *args, **kwargs)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/generics.py" in put
  256.         return self.update(request, *args, **kwargs)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/mixins.py" in update
  70.         self.perform_update(serializer)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/mixins.py" in perform_update
  74.         serializer.save()

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/serializers.py" in save
  187.             self.instance = self.update(self.instance, validated_data)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/rest_framework/serializers.py" in update
  907.             setattr(instance, attr, value)

File "/home/asus/Documents/Gsource/gsource/local/lib/python2.7/site-packages/django/db/models/fields/related_descriptors.py" in __set__
  207.                     self.field.remote_field.model._meta.object_name,

Exception Type: ValueError at /api/account/edit/1/
Exception Value: Cannot assign "{u'username': u'kais'}": "Account.my_user" must be a "User" instance.

不会调用您的
update
方法,因为它是序列化程序(
AccountUpdateSerializer.meta
)的元类的方法,而不是序列化程序类
AccountUpdateSerializer
本身

下面是它的外观:

class AccountUpdateSerializer(serializers.ModelSerializer):

    username=serializers.CharField(source ='my_user.username')

    class Meta:

        model= Account
        fields=['id','username','statut','date']

    def update(self, instance, validated_data):
        print(instance)
        instance.statut = validated_data.get('statut', instance.statut)
        instance.my_user.username = validated_data['username']
        return instance

(或者您只是错误地发布了代码?

您的
更新
方法没有被调用,因为它是序列化程序的元类(
AccountUpdateSerializer.meta
)的方法,而不是序列化程序类
AccountUpdateSerializer
本身

下面是它的外观:

class AccountUpdateSerializer(serializers.ModelSerializer):

    username=serializers.CharField(source ='my_user.username')

    class Meta:

        model= Account
        fields=['id','username','statut','date']

    def update(self, instance, validated_data):
        print(instance)
        instance.statut = validated_data.get('statut', instance.statut)
        instance.my_user.username = validated_data['username']
        return instance

(或者您只是错误地发布了代码?

您的模型有my_用户,而您的序列化程序有my_用户名。是哪一个?我的意思是我的用户名不是我的用户名我纠正了它,但同样的问题编辑你的问题并发布准确的代码,这样人们就不必猜测异常是否仍然与你的代码匹配?我再也看不到“Account.my_user”的分配了。另外,请发布完整的stacktraceas@DanielHepper指出,这真的不应该产生相同的错误。请发布完整的stacktrace(请以文本形式,而不是图像形式)。您的模型有my_用户,您的序列化程序有my_用户名。是哪一个?我的意思是我的用户名不是我的用户名我纠正了它,但同样的问题编辑你的问题并发布准确的代码,这样人们就不必猜测异常是否仍然与你的代码匹配?我再也看不到“Account.my_user”的分配了。另外,请发布完整的stacktraceas@DanielHepper指出,这真的不应该产生相同的错误,请发布完整的stacktrace(请以文本形式,而不是图像形式)