说我有一个序列化程序A
class SerializerA(ModelSerializer):
some_field = CharField()
some_other_field = CharField()
field_require_other_model = SerializerMethodField()
class Meta:
model = ModelA
fields = ('some_field', 'some_other_field', 'field_require_other_model')
def get_field_require_other_model(self, instance):
other_model_qs = ModelB.objects.filter(email=instance.email)
# say I want to get whatever that comes first
return other_model_qs.first().useful_info
如上所述,SerializerA
使用ModelA
来获取除ModelB
中的一个字段以外的所有字段。我可以从ModelB
处获取信息,但我不知道这是否是获取数据的最佳方法。我不确定是否需要多次访问数据库或是否有一种方法可以对数据库进行延迟评估。
此外,如果我还有另一个SerializerMethodField()
使用ModelB
但又提供了不同的信息怎么办。这样仍然是获取数据的最佳方法吗?
答案 0 :(得分:1)
如何使用.annotate
,将另一个字段从modelB注释到modelA上,然后在序列化程序上将其定义为charfield(或任何类型的类型)?
类似
queryset = ModelA.objects.all().annotate(other_field_on_model_b=F('ModelB__other_field_on_model_b'))
然后在序列化器中
class SerializerA(ModelSerializer):
some_field = CharField()
some_other_field = CharField()
other_field_on_model_b = CharField(required=False) #or whatever the field type is.
class Meta:
model = ModelA
fields = ('some_field', 'some_other_field', 'other_field_on_model_b')
可以在get_queryset()
或端点本身中进行注释。