1

使用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) 

回答

0

您不需要在AuthorSeria中定义to_native和field_to_native liser。同样在CommentSerialiser restore_object中你输入if instance.author is None:,我认为应该是if instance.author is not None:,但即使这样也可能被删除;如果没有,你可以把instance.author = attrs.get('author', instance.author)

如果作者是EmbeddedDocument,还有一件事情不应该需要id,如果它需要id,你应该声明它为Document,关系应该是ReferenceField