Создайте ошибку Raise в модели (чистый метод не работает)

Я хочу выдать ошибку, например: если пользователь создаст оба bus_stop_1 и bus_stop_2 с одним и тем же внешним ключом или если количество объектов в таблице превышает 4

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


class ConnectedRoute(models.Model):
    bus_stop_1 = models.ForeignKey(
        BusStop, on_delete=models.CASCADE, related_name='stop1')
    bus_stop_2 = models.ForeignKey(
        BusStop, on_delete=models.CASCADE, related_name='stop2')
    distance = models.FloatField(blank=True, null=True)
    time = models.TimeField(blank=True, null=True)

    def clean(self):
        if self.bus_stop_1 == self.bus_stop_2:
            raise ValidationError('Both stop cannot to the same')
        count_stop1 = ConnectedRoute.objects.filter(
            bus_stop_1=self.bus_stop_1).count()
        count_stop2 = ConnectedRoute.objects.filter(
            bus_stop_2=self.bus_stop_2).count()

        if count_stop1 + count_stop2 > 4:
            raise ValidationError('Only 4 connections allowed.')

Я пытался использовать этот чистый метод, но так и не нашел его полезным Может быть, я что-то упускаю

?

Нужно вызвать model_instance.save(), чтобы вызвать метод clean() для проверки, или можно вручную вызвать model_instance.clean(), а затем model_instance.save()

Попробуйте переопределить метод save и вызвать full_clean() в save.

class ConnectedRoute(models.Model):
   bus_stop_1 = models.ForeignKey(
       BusStop, on_delete=models.CASCADE, related_name='stop1')
   bus_stop_2 = models.ForeignKey(
       BusStop, on_delete=models.CASCADE, related_name='stop2')
   distance = models.FloatField(blank=True, null=True)
   time = models.TimeField(blank=True, null=True)


   def clean(self):
      if self.bus_stop_1 == self.bus_stop_2:
         raise ValidationError('Both stop cannot be the same')
      
      count_stop1 = ConnectedRoute.objects.filter(
           bus_stop_1=self.bus_stop_1).count()
      count_stop2 = ConnectedRoute.objects.filter(
           bus_stop_2=self.bus_stop_2).count()

      if count_stop1 + count_stop2 > 4:
        raise ValidationError('Only 4 connections allowed.')

   def save(self, *args, **kwargs):
      self.full_clean()
      super().save(*args, **kwargs)}
Вернуться на верх