Django REST: исключить некоторые поля и отфильтровать вложенный сериализатор - PullRequest
0 голосов
/ 15 февраля 2020

Я пытаюсь исключить поле «проспект» из сериализатора Appointment, который вложен в Serializer модуля.

Как вы можете видеть ниже, из-за некоторых манипуляций с данными в наборе запросов Appointment я решил использовать SerializerMethodField для определения сериализатора Appointment. Однако я не уверен, как исключить поля при использовании SerializerMethodField.

В качестве альтернативы я мог бы использовать ModelSerializer для Встречи, которая позволяет мне определять, какие поля включать, но тогда я не смогу манипулировать данными так, как я хочу.

Обратите внимание, что делать.

Модели

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 UnitSerializer(serializers.ModelSerializer):
    availability = SerializerMethodField()
    manager = ManagerSerializer()
    instruction = InstructionSerializer(source='instruction_set', many=True)
    appointment = SerializerMethodField()

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

    def get_availability(self, instance): 
        queryset = instance.availability_set.order_by('start_time')
        return AvailabilitySerializer(queryset, many=True).data

    def get_appointment(self, instance):
        start_buffer = 0.5 ## How many hours from now do we start displaying appointments in the queue
        end_buffer = 72 ## How many hours from now do we stop displaying appointments in the queue
        start_cutoff = datetime.now() + timedelta(hours=start_buffer)
        end_cutoff = datetime.now() + timedelta(hours=end_buffer)
        queryset = instance.appointment_set.exclude(appointment_time__lt=start_cutoff).exclude(appointment_time__gt=end_cutoff).order_by('appointment_time')
        return AppointmentSerializer(queryset, many=True).data

JSON Представление объекта

AJAX Call

...