使用django-nonrel在rest_framework上进行ForeignKey ListField序列化

时间:2015-05-27 16:16:29

标签: django mongodb serialization django-rest-framework django-nonrel

我有一个名为Collection

的类
class Collection(models.Model):
    slug = models.CharField(max_length=32, primary_key=True)
    name = models.CharField(max_length=200)
    description = models.TextField()
    user = models.ForeignKey(User)
    videos = ListField(models.ForeignKey(Video))
    pub_date = models.DateTimeField('date published')

    objects = MongoDBManager()

有一个视频属性,它是Video对象ForeignKeys的ListField。

当我尝试在rest_framework上串行化Collection对象时,创建我的序列化器:

class CollectionSerializer(serializers.HyperlinkedModelSerializer):

    videos = VideoSerializer(many=True)

    class Meta:
        model = Collection
        fields = ('name','description','videos', 'pub_date')

但是我收到了这个错误:

Got AttributeError when attempting to get a value for field `name` on serializer `VideoSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `unicode` instance.
Original exception text was: 'unicode' object has no attribute 'name'.

尽管使用 VideoSerializer 我使用了 serializers.StringRelatedField 然后我得到一个objectids数组作为字符串。但我想要的是序列化器来获取oobjectids数组并将它们转换为Vido Objects并将它们序列化。

MongoDB上的对象如下所示:

{
    "_id": "ibiza",
    "user_id": {
        "$oid": "5564c86e424f777f81d8f3ec"
    },
    "description": "ertertertre",
    "videos": [
        {
            "$oid": "5564d0c8424f7704aea99813"
        }
    ],
    "pub_date": {
        "$date": "2015-05-27T12:20:57.000Z"
    },
    "name": "Ibiza"
} 

注意:我想避免使用EmbeddedModelField

1 个答案:

答案 0 :(得分:0)

这里的问题是您将字符串(unicode类型)传递给DRF,但您希望DRF将其转换为嵌套表示形式。没有任何额外的东西,DRF是不可能这样做的,因为它超出了它试图维护的一般范围。

另一方面,

Django REST framework Mongoengine处理抽象层非常好,建议那些使用Django REST框架和Mongoengine的人。

如果没有抽象层,您将被迫create a custom field将对象ID转换为实际对象,然后将它们序列化为嵌套表示。