2013-06-22 6 views
4

Я пытаюсь использовать Django и Django REST Framework вместе с MongoEngine, но, похоже, это не работает для меня. Я не знаю, где все пошло не так ... возможно, кто-то может мне помочь. Вот код:AttributeError с Django REST Framework и MongoEngine

models.py

from mongoengine import * 

class Lady(Document): 
    firstname = StringField() 
    lastname = StringField() 

serializers.py

from rest_framework import serializers 
from mongoengine import * 

class LadySerializer(serializers.Serializer): 

    firstname = serializers.CharField(max_length=50) 
    lastname = serializers.CharField(max_length=50) 

    def restore_object(self,attrs,instance=None): 
     if instance: 
      instance.firstname = attrs.get('firstname', instance.firstname) 
      instance.lastname = attrs.get('lastname', instance.lastname) 
      return instance 
     return Lady(**attrs) 

Теперь я могу проверить, если сериализации с помощью интерактивной консоли. Я выполняю следующие команды.

from core.models import * 
from core.serializers import * 
tiger = Lady(firstname='Tiger', lastname="Lily") 
serial = LadySerializer(tiger) 
serial.data 

, что я получаю:

Traceback (most recent call last): 
File "<console>", line 1, in <module> 
File "/home/evermean/Code/django/env/pourl/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 499, in data 
self._data = [self.to_native(item) for item in obj] 
File "/home/evermean/Code/django/env/pourl/local/lib/python2.7/site-packages/rest_framework/serializers.py", line 306, in to_native 
value = field.field_to_native(obj, field_name) 
File "/home/evermean/Code/django/env/pourl/local/lib/python2.7/site-packages/rest_framework/fields.py", line 164, in field_to_native 
value = get_component(value, component) 
File "/home/evermean/Code/django/env/pourl/local/lib/python2.7/site-packages/rest_framework/fields.py", line 56, in get_component 
val = getattr(obj, attr_name) 
AttributeError: 'str' object has no attribute 'firstname' 

Теперь я не знаю, почему это происходит, так как есть атрибут Firstname в классе леди? Что мне здесь не хватает?

Спасибо ...

+0

как вы называете сериализатор в коде? – karthikr

+0

serial = LadySerializer (тигр), а затем serial.data ... – evermean

ответ

11

Наконец-то получил решение. Мне нужно было явно установить many = False, чтобы заставить его работать. Так это работает отлично:

from core.models import * 
from core.serializers import * 
tiger = Lady(firstname='Tiger', lastname="Lily") 
serial = LadySerializer(tiger, many=False) 
serial.data 

и выходы:

{'firstname': u'Tiger', 'lastname': u'Lily'} 

Вы можете найти дополнительную информацию об этой проблеме here. Интересной частью этого случая является следующая публикация:

Версия 2.2 начинает отмену неявного поведения итерации. На данный момент вам нужно явно указать many=False, чтобы заставить поведение не перебирать объекты стиля __iter__. По 2.4 значение по умолчанию переключится с None на False.

Надеется, что это помогает ....

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