Создайте ошибку 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)}