Как написать метод обновления в сериализаторе в 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
но это не сработало