【发布时间】:2016-09-25 19:15:12
【问题描述】:
我有以下模型和序列化程序,目标是当序列化程序运行时只有一个查询:
型号:
class Assignee(EmbeddedDocument):
id = ObjectIdField(primary_key=True)
assignee_email = EmailField(required=True)
assignee_first_name = StringField(required=True)
assignee_last_name = StringField()
assignee_time = DateTimeField(required=True, default=datetime.datetime.utcnow)
user = ReferenceField('MongoUser', required=True)
user_id = ObjectIdField(required=True)
class MongoUser(Document):
email = EmailField(required=True, unique=True)
password = StringField(required=True)
first_name = StringField(required=True)
last_name = StringField()
assignees= EmbeddedDocumentListField(Assignee)
序列化器:
class MongoUserSerializer(DocumentSerializer):
assignees = AssigneeSerializer(many=True)
class Meta:
model = MongoUser
fields = ('id', 'email', 'first_name', 'last_name', 'assignees')
depth = 2
class AssigneeSerializer(EmbeddedDocumentSerializer):
class Meta:
model = Assignee
fields = ('assignee_first_name', 'assignee_last_name', 'user')
depth = 0
在检查 mongo 分析器时,我对 MongoUser 文档有 2 个查询。如果我从 MongoUserSerializer 中删除受让人字段,则只有一个查询。
作为一种解决方法,我尝试使用 user_id 字段仅存储 ObjectId 并将 AssigneeSerializer 更改为:
class AssigneeSerializer(EmbeddedDocumentSerializer):
class Meta:
model = Assignee
fields = ('assignee_first_name', 'assignee_last_name', 'user_id')
depth = 0
但同样有 2 个查询。我认为序列化程序 EmbeddedDocumentSerializer 获取 ReferenceField 和
的所有字段和查询fields = ('assignee_first_name', 'assignee_last_name', 'user_id')
在查询完成后工作。 序列化时如何使用 ReferenceField 而不为每个引用运行单独的查询?
【问题讨论】:
标签: mongodb serialization django-rest-framework mongoengine