1

我正在尝试制作一个使用 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 方法的 AuthorSerializer:

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)
4

1 回答 1

0

您不需要在 AuthorSerialiser 中定义 to_native 和 field_to_native。同样在 CommentSerialiser restore_object 你放if instance.author is None:,我认为应该是if instance.author is not None:,但即使这样也可以被删除;你可以instance.author = attrs.get('author', instance.author)不用if。

另一件事是,如果作者是 EmbeddedDocument,则不需要 id,如果它需要 id,则应将其声明为 Document,并且关系应为ReferenceField.

于 2014-09-26T22:10:55.727 回答