问题描述
在 Django 项目中,我使用 mongoengine
为 MongoDB 集合提供 Django 样式模型。我还使用 django-rest-framework-mongoengine
巫婆扩展 DRF 来支持 Documents
、EmbeddedDocuments
、DynamicDocuments
和 DynamicEmbeddedDocuments
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 (将#修改为@)