1

MongoDB をバックエンドとして使用し、Django Rest Framework と Mongoengine をフロントエンドとして使用するコメント システムを作成しようとしています。

コメント システムはコメントをデータベースに保存し、すべてのコメントには 1 人の作成者しかいません。

次のアプローチは私にとってはうまくいきますが、これが賢明な方法であるかどうかを尋ねたかったのです。

Author ドキュメントを埋め込んだ Comment ドキュメントがあります。

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 という 2 つのシリアライザーを定義しました。

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

1 に答える 1