I am new to django and I have this serializer
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)
I want to write an update method with the same fields and the same validators. I tried to write something but didn’t work. How can I write this? I want to prevent the user to put date that exists when he/she update the dates.