在Django序列化器中获取其他模型信息的正确方法是什么?

时间:2019-06-06 20:31:30

标签: django django-serializer

说我有一个序列化程序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但又提供了不同的信息怎么办。这样仍然是获取数据的最佳方法吗?

1 个答案:

答案 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()或端点本身中进行注释。