【问题标题】:How do I properly use mongoengine embedded document in Django Rest Framework如何在 Django Rest Framework 中正确使用 mongoengine 嵌入式文档
【发布时间】:2014-09-27 06:10:55
【问题描述】:

我正在尝试制作一个使用 MongoDB 作为后端、Django Rest Framework 和 Mongoengine 作为前端的评论系统。

评论系统会将评论保存在数据库中,每条评论将有一个且只有一个作者。

以下方法对我有用,但我想问你这是否是可取的方法。

我有一个嵌入作者文档的评论文档。

class Author(EmbeddedDocument):
    id = StringField(required=True,primary_key=True)
    author_name = StringField()

class Comment(Document):
    discussion_id = StringField(required=True)
    parent_id = ObjectIdField(required=False)
    slug = StringField()
    full_slug= StringField()
    posted = DateTimeField()
    text = StringField()
    author = EmbeddedDocumentField(Author)

    meta = {
        'indexes': [ {'fields' : ['parent_id', 'id'] }]
    }

这就是我定义序列化程序的方式:

我定义了两个序列化器,CommentSerialiser

class CommentSerialiser(serializers.Serializer):
    id = serializers.CharField(required=True,max_length=50)
    discussion_id = serializers.CharField()
    parent_id = serializers.CharField()
    slug = serializers.CharField()
    full_slug= serializers.CharField()
    posted = serializers.DateTimeField()
    text = serializers.CharField()
    author = AuthorSerialiser(required=False)

    def restore_object(self, attrs, instance=None):
        if instance:
            instance.id = attrs.get('id', instance.id)
            instance.discussion_id = attrs.get('discussion_id', instance.discussion_id)
            instance.parent_id = attrs.get('parent_id', instance.parent_id)
            instance.slug = attrs.get('slug', instance.slug)
            instance.full_slug = attrs.get('full_slug', instance.full_slug)
            instance.posted = attrs.get('posted', instance.posted)
            instance.text = attrs.get('text', instance.text)
            if instance.author is None:
               instance.author = attrs.get('author', instance.author)                                                                          
            return instance
        return Comment(**attrs)

以及重写了 to_native 和 field_to_native 方法的 AuthorSerialiser:

class AuthorSerialiser(serializers.Serializer):
    id = serializers.CharField(required=True,max_length=50)
    author_name = serializers.CharField(required=True,max_length=50)

    def to_native(self, obj):

        ret = self._dict_class()
        ret.fields = self._dict_class()

        ret.fields["id"]="id"
        ret["id"]=obj.id
        ret.fields["name"]="name"
        ret["name"]=obj.author_name


        return ret

    def field_to_native(self, obj, field_name):

        return self.to_native(obj.author)

【问题讨论】:

    标签: django mongodb django-rest-framework mongoengine embedded-documents


    【解决方案1】:

    您无需在 AuthorSerialiser 中定义 to_native 和 field_to_native。同样在 CommentSerialiser restore_object 中,您输入了if instance.author is None:,我认为应该是if instance.author is not None:,但即使这样也可以删除;你可以在没有 if 的情况下输入 instance.author = attrs.get('author', instance.author)

    如果作者是 EmbeddedDocument 则不需要 id,如果它需要 id,您应该将其声明为 Document,并且关系应该是 ReferenceField

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-26
      • 1970-01-01
      相关资源
      最近更新 更多