Как правильно получить информацию о другой модели в сериализаторе Django? - PullRequest
1 голос
/ 06 июня 2019

Скажите, у меня есть сериализатор 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 Ответ

1 голос
/ 06 июня 2019

Как насчет использования .annotate, аннотирования другого поля на modelA из modelB, а затем определения его как поля char (или любого типа) на сериализаторе?

Что-то вроде

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() или в самой конечной точке.

...