Django Rest Framwork - Выберите только некоторые поля в наборе запросов обратного просмотра - PullRequest
0 голосов
/ 31 января 2020

Я пытаюсь получить только некоторые полей в «Встречи», связанных с арендуемой собственностью «Юнит». Из UnitSerializer я вызываю SerializerMethodField () для обратного поиска поля «назначение». Это хорошо работает. Однако набор запросов возвращает все поля (идентификатор, время, единица измерения, персонал, проспект) в каждом объекте, когда мне нужно только несколько (идентификатор, время).

Я пытался .values ​​() в наборе запросов например так:

queryset = instance.appointment_set.values('id', 'appointment_time')

Но я получаю "Получил KeyError при попытке получить значение для полевого модуля на сериализаторе AppointmentSerializer. \ nПоле сериализатора может быть названо неправильно и не соответствовать ни одному атрибуту или ключу на экземпляр dict. \ nПервоначальный текст исключения был: unit. "

Обратите внимание, если вам нужен весь код, но вот главное.

Модели

class Appointment(models.Model):
    appointment_time = models.DateTimeField()
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE)
    staff = models.ForeignKey(Staff, on_delete=models.CASCADE)
    prospect = models.ForeignKey(Prospect, on_delete=models.CASCADE)

Сериализаторы

class AppointmentSerializer(serializers.ModelSerializer):

    class Meta:
        model = Appointment
        fields = ['id','appointment_time']


class UnitSerializer(serializers.ModelSerializer):
    appointment = SerializerMethodField()

    class Meta:
        model = Unit
        fields = ['id', 'address', 'appointment']

    def get_appointment(self, instance):
        cutoff = _datetime.date.today() + timedelta(hours=72)
        queryset = instance.appointment_set.exclude(appointment_time__gt=cutoff)
        return AppointmentSerializer(queryset, many=True).data

1 Ответ

1 голос
/ 31 января 2020

Существует лучший способ обработки обратных отношений в сериализаторе:

class UnitSerializer(ModelSerializer):
    appointment = AppointmentSerializer(many=True, source='appointment_set')

class Meta:
    model = Unit
    fields = ['id', 'address', 'appointment']
...