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