向 django-rest-framework-mongoengine 添加抽象模型支持

问题描述

在 Django 项目中,我使用 mongoengine 为 MongoDB 集合提供 Django 样式模型。我还使用 django-rest-framework-mongoengine 巫婆扩展 DRF 来支持 DocumentsEmbeddedDocumentsDynamicDocumentsDynamicEmbeddedDocuments MongoDB 的 MongoEngine 模型表示。

虽然 Django 和 DRF 允许在模型中使用抽象类。这现在由 DRF-mongoengine 支持。但是我相信可以通过编写自定义序列化程序来添加对抽象模型的支持

到目前为止,我未能成功,如果您能帮助我实现此目的,我将不胜感激。

class Entry(Document)
    Meta = {
        'abstract': True,'allow_inheritance': True,}
    text = StringField()

class Post(Entry)
    Meta = {
        'allow_inheritance': True,}

class comment(Entry)
    Meta = {
        'allow_inheritance': True,}
    post = ReferenceField(Post) # No Problem serializing this
    # for the sake of Demonstration,related is a list of posts and comments
    related = ListField(ReferenceField(Entry)) # This is not supported by DRF-mongoengine

class PostSerializer(DocumentSerializer) # Works
    class Meta:
        model = Post
        fields = '__all__'

class PostsViewSet(ModelViewSet):
    serializer_class = PostSerializer
    queryset = Post.objects.all()

class CommentSerializer(DocumentSerializer) # Fails
    class Meta:
        model = Comment
        fields = '__all__'

class CommentsViewSet(ModelViewSet):
    serializer_class = CommentSerializer
    queryset = Comment.objects.all()

这是访问该 CommentViewSet 时的错误消息的尾部:

 File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/serializers.py",line 345,in get_fields
    field_class,field_kwargs = self.build_field(
  File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/serializers.py",line 570,in build_field
    child_class,child_kwargs = self.build_field(child_name,info,model_class,nested_depth,embedded_depth)
  File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/serializers.py",line 583,in build_field
    return self.build_reference_field(field_name,relation_info,nested_depth)
  File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/serializers.py",line 674,in build_reference_field
    related_class = related_model.id.__class__
AttributeError: type object 'AbstractEntityModel' has no attribute 'id'

我目前正在尝试为字段 CommentSerializer.related 编写自定义序列化程序,我对此有疑问

class RelatedSerializer(DocumentSerializer) # should I use a different parent class?
    class Meta:
        model = Entry
        fields = '__all__'
    # What functions should I add here?
    # def create(self,data):
    #     do magic here     
    #     return instance
    # def update(self,instance,data):
    #     do magic here     
    #     return instance

class CommentSerializer(DocumentSerializer) # Fails
    class Meta:
        model = Comment
        fields = '__all__'
    related = RelatedSerializer()

这是访问该 CommentViewSet 时的错误消息的尾部。

  File "~/app/venv/lib/python3.9/site-packages/rest_framework/serializers.py",line 349,in fields
    for key,value in self.get_fields().items():
  File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/serializers.py",line 326,in get_fields
    self.field_info = get_field_info(model)
  File "~/app/venv/lib/python3.9/site-packages/rest_framework_mongoengine/utils.py",line 66,in get_field_info
    pk = model._fields[model._Meta['id_field']]
KeyError: 'id_field'

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...