Как запретить пользователю добавлять праздник, дата которого совпадает с датой другого праздника в 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)

Но когда я создаю или обновляю государственный праздник, который имеет те же даты, что и другие государственные праздники, это не работает. Как я могу решить эту проблему

  1. Необходимо проверить данные в методе validate сериализатора
  2. .
  3. Попробуйте сначала запустить запрос 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)
Вернуться на верх