Как написать метод обновления в сериализаторе в django?

Я новичок в django и у меня есть этот сериализатор

class PersonHolidaysSerializer(serializers.ModelSerializer):
person_name = serializers.ReadOnlyField()
holiday_type_name = serializers.ReadOnlyField()
person_full_name = serializers.ReadOnlyField(
    source="person.person_full_name")

class Meta:
    model = PersonHoliday
    # fields = ('on_holidays', 'holidays_start_date',
    #           'holidays_end_date', 'comments', 'person_name', 'person')
    fields = '__all__'

def get_date_ranges(self, start_date: date, end_date: date) -> list[date]:
    dt = (end_date - start_date).days
    return [start_date + timedelta(days=day) for day in range(dt+1)]

def day_exists(self, values: QuerySet, requested_dates: list[date]) -> bool:
    delta_days_array = []
    for value in values:
        existed_delta_days = self.get_date_ranges(
            value['holidays_start_date'],
            value['holidays_end_date']
        )
        delta_days_array.append(existed_delta_days)

    return any(x in y for x in requested_dates for y in delta_days_array)

def create(self, validated_data):
    person = validated_data.get('person')
    start_date = validated_data.get('holidays_start_date')
    end_date = validated_data.get('holidays_end_date')
    holiday_type = validated_data.get('holiday_type')
    instance_holiday = PersonHoliday.objects.filter(
        Q(holidays_start_date__month=start_date.month) &
        Q(holidays_start_date__year=start_date.year) |
        Q(holidays_end_date__month=end_date.month) &
        Q(holidays_end_date__year=end_date.year),
        person=person,

    )

    if not instance_holiday.exists():
        return super(PersonHolidaysSerializer, self).create(validated_data)
    requested_delta_days = self.get_date_ranges(start_date, end_date)
    if self.day_exists(instance_holiday.values(), requested_delta_days):
        raise serializers.ValidationError('Holiday coincides with other holidays')
    if start_date>end_date:
        raise serializers.ValidationError("End date should be after start date")
    if not holiday_type:
        raise serializers.ValidationError("You should put a holiday type")
    return super(PersonHolidaysSerializer, self).create(validated_data)

Я хочу написать метод обновления с теми же полями и теми же валидаторами. Я пытался что-то написать, но ничего не получилось. Как я могу написать это? Я хочу, чтобы при обновлении дат пользователь не ставил дату, которая уже существует.

вы можете написать update метод в сериализаторах.

 def update(self, instance, validated_data):
        instance.file_1 = validated_data.get('field_1', instance.field_1)
        instance.file_2 = validated_data.get('field_2', instance.field_2)
        return instance

Я попробовал следующее:

def update(self, instance, validated_data):
    instance.person=validated_data.get('person', instance.person)
    instance.start_date=validated_data.get('holidays_start_date',instance.start_date)
    instance.end_date=validated_data.get('holidays_end_date',instance.end_date)
    instance.holiday_type=validated_data.get('holiday_type',instance.holiday_type)
    updated_holiday=PersonHoliday.objects.filter(
        Q(holidays_start_date__month=instance.start_date.month) &
        Q(holidays_start_date__year=instance.start_date.year) |
        Q(holidays_end_date__month=instance.end_date.month) &
        Q(holidays_end_date__year=instance.end_date.year),
        person=instance.person,
    )

    if not updated_holiday.exists():
        return super(PersonHolidaysSerializer, self).update(validated_data)
    instance.requested_delta_days = self.get_date_ranges(instance.start_date, instance.end_date)
    if self.day_exists(updated_holiday.values(), instance.requested_delta_days):
        raise serializers.ValidationError('Οι ημερομηνίες συμπίπτουν με άλλες ημερομηνίες αδειών')
    if instance.start_date>instance.end_date:
        raise serializers.ValidationError("Η ημερομηνία λήξης πρέπει να είναι μετά την ημερομηνία έναρξης")
    if not instance.holiday_type:
        raise serializers.ValidationError("Ο τύπος άδειας είναι υποχρεωτικός")
    
    instance.save()
    return instance

но это не сработало

Вернуться на верх