2013-06-22 55 views
4

我正在尝试将Django和Django REST框架与MongoEngine一起使用,但它似乎不适用于我。我不知道哪里出了问题......也许有人可以帮助我。下面是代码:Django REST框架和MongoEngine的AttributeError

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(tiger)然后serial.data ... – evermean

回答

11

终于找到了解决办法。我需要明确地设置许多=假使它工作。所以这工作得很好:

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

希望这有助于....