使用mongoengine嵌入文档我试图让使用MongoDB的作为后端和Django的REST框架和Mongoengine作为前端的评论系统。如何正确Django的REST框架
评论系统会保存注释在数据库中,每一个注释都会有一个且只有一个作者。
以下办法为我工作,但我想问问你,如果这是最好的方式去做。
我有一个嵌入文档作者评论文档。
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)
和AuthorSerialiser已覆盖to_native和field_to_native方法:
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)