Как запретить пользователю добавлять праздник, дата которого совпадает с датой другого праздника в django?
Я новичок в django. Моя модель выглядит следующим образом:
class PublicHoliday(models.Model):
name = models.CharField(_('Holiday Name'), max_length=100, unique=True)
date_time = models.DateField(_('Holiday Date'))
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self) -> str:
return self.name
@receiver(pre_save, sender=PublicHoliday)
def save_current_year(sender, instance, **kwargs):
new_intance_date_time = instance.date_time.replace(year=timezone.now(
).year, month=instance.date_time.month, day=instance.date_time.day)
instance.date_time = new_intance_date_time
А сериализатор выглядит так:
class PublicHolidayCreateSerializer(serializers.ModelSerializer):
class Meta:
model = PublicHoliday
fields = '__all__'
def create(self, validated_data):
if PublicHoliday.objects.filter(date_time=validated_data['date_time']).exists():
raise serializers.ValidationError("This public day already exists")
return super().create(validated_data)
def update(self, instance, validated_data):
if 'date_time' in validated_data and PublicHoliday.objects.filter(date_time=validated_data['date_time']).exclude(pk=instance.pk).exists():
raise serializers.ValidationError("This public day already exists")
return super().update(instance, validated_data)
Но когда я создаю или обновляю государственный праздник, который имеет те же даты, что и другие государственные праздники, это не работает. Как я могу решить эту проблему
- Необходимо проверить данные в методе validate сериализатора .
- Попробуйте сначала запустить запрос
PublicHoliday.objects.filter(date_time=validated_data['date_time'])
в оболочке. Скорее всего, он возвращаетFalse
, потому чтоvalidated_data['date_time']
может быть строкой. Вам следует сформировать объектdatetime
изvalidated_data['date_time']
, прежде чем сравнивать его в query.
class PublicHolidayCreateSerializer(serializers.ModelSerializer):
class Meta:
model = PublicHoliday
fields = '__all__'
def create(self, validated_data):
return super().create(validated_data)
def update(self, instance, validated_data):
if 'date_time' in validated_data and PublicHoliday.objects.filter(date_time=validated_data['date_time']).exclude(pk=instance.pk).exists():
raise serializers.ValidationError("This public day already exists")
return super().update(instance, validated_data)
def validate(self, attrs):
your_date_format = "%Y-%m-%d" #make sure this matches with the one you're sending through the API call
# do the import at the top of your file
import datetime from datetime
incoming_date = datetime.strptime(attrs["date_time"],your_date_format)
qs = PublicHoliday.objects.filter(date_time=incoming_date.date)
if qs.exists():
raise serializers.ValidationError("This public day already exists")
return super().validate(attrs)