【问题标题】:AttributeError with Django REST Framework and MongoEngineDjango REST Framework 和 MongoEngine 的 AttributeError
【发布时间】:2013-06-22 16:59:42
【问题描述】:

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

models.py

from mongoengine import *

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

序列化器.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'

现在我真的不知道为什么会发生这种情况,因为 Lady 类中有一个 firstname 属性?我在这里错过了什么?

谢谢...

【问题讨论】:

  • 如何在代码中调用序列化程序?
  • serial = LadySerializer(tiger) 然后是 serial.data ...

标签: python django mongoengine django-rest-framework


【解决方案1】:

终于解决了。我需要明确设置 ma​​ny=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

希望这会有所帮助....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多