如何在 django 的序列化器中编写更新方法?

问题描述 投票:0回答:1

我是 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)

我想编写一个具有相同字段和相同验证器的更新方法。我试图写点东西但没有成功。我该怎么写这个?我想阻止用户在更新日期时输入已存在的日期。

django
1个回答
0
投票

您可以在序列化器中编写

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
© www.soinside.com 2019 - 2024. All rights reserved.