2015-09-25 2 views
1

Я пытаюсь сериализовать поля из двух моделей в отношении Onetofield. Поэтому я перезаписываю обновление и метод to_representation из сериализатора. Для запроса GET все работает нормально, но запрос POST бросаетПерезаписать update и to_representation метод throws AttributeError при запросе POST

AttributeError в/personalData/

объекта 'OrderedDict' не имеет атрибута 'ПгвЬЫате'

Ошибка.

Мои модели:

class UserData(models.Model): 
    user = models.OneToOneField(User) 

    gender = models.CharField(max_length=20, blank=True) 
    firstname = models.CharField(max_length=50, blank=True) 
    lastname = models.CharField(max_length=50, blank=True) 
    nationality = models.CharField(max_length=30, blank=True) 

class Employee(models.Model): 
    userData = models.OneToOneField(UserData) 

    birthdate = models.CharField(max_length=30, blank=True) 
    jobTitle = models.CharField(max_length=50, blank=True) 

Мой сериализатору класс:

class EmployeePersonalDataSerializer(serializers.Serializer): 
    firstname = serializers.CharField() 
    lastname = serializers.CharField() 
    birthdate = serializers.CharField() 
    gender = serializers.CharField() 
    jobTitle = serializers.CharField() 
    nationality = serializers.CharField() 

    def update(self, instance, validated_data): 
     instance.firstname = validated_data.get('firstname', instance.firstname) 
     instance.lastname = validated_data.get('lastname', instance.lastname) 
     instance.gender = validated_data.get('gender', instance.gender) 
     instance.nationality = validated_data.get('nationality', instance.nationality) 
     instance.employee.jobTitle = validated_data.get('jobTitle', instance.employee.jobTitle) 
     instance.employee.birthdate = validated_data.get('birthdate', instance.employee.birthdate) 
     instance.employee.save() 
     instance.save() 
     return instance 


    def to_representation(self, obj): 
     return { 
        'firstname': obj.firstname, 
        'lastname': obj.lastname, 
        'birthdate': obj.employee.birthdate, 
        'gender': obj.gender, 
        'jobTitle': obj.employee.jobTitle, 
        'nationality': obj.nationality 
       } 

EDIT:

Полный отслеживающий:

Traceback: 
File "/home/user/.local/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response 
    132.      response = wrapped_callback(request, *callback_args, **callback_kwargs) 
File "/home/user/.local/lib/python2.7/site-packages/django/views/decorators/csrf.py" in wrapped_view 
    58.   return view_func(*args, **kwargs) 
File "/home/user/.local/lib/python2.7/site-packages/django/views/generic/base.py" in view 
    71.    return self.dispatch(request, *args, **kwargs) 
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch 
    466.    response = self.handle_exception(exc) 
File "/usr/local/lib/python2.7/dist-packages/rest_framework/views.py" in dispatch 
    463.    response = handler(request, *args, **kwargs) 
File "/myproject/views.py" in post 
    177.    serializer.update(instance=userData, validated_data=serializer.data) 
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data 
    487.   ret = super(Serializer, self).data 
File "/usr/local/lib/python2.7/dist-packages/rest_framework/serializers.py" in data 
    225.     self._data = self.to_representation(self.validated_data) 
File "/myproject/serializers.py" in to_representation 
    226.      'firstname': obj.firstname, 

Exception Type: AttributeError at /personalData/ 
Exception Value: 'OrderedDict' object has no attribute 'firstname' 
+0

Просьба показать полную информацию о трассе. – Alasdair

ответ

1

Fro м DRF документы

Если вы хотите реализовать реляционную поле чтения-записи, вы должны также реализовать .to_internal_value (самостоятельно, данных) метод.

Итак, вы хотите реализовать поле чтения/записи (POST/GET), поэтому вам необходимо реализовать метод .to_internal_value в вашем сериализаторе.

1

Вам необходимо использовать вложенные сериализаторы. Ошибка говорит, что на сотрудника нет ни одного имени, которого нет. Вам необходим сериализатор для Employee и UserData.

Смежные вопросы