我正在尝试制作一个使用 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)