Django ORM: ограничить отношение внешних ключей между моделями ограниченным числом раз - PullRequest
0 голосов
/ 25 января 2020

У меня есть две модели: автомобиль и водитель. В любой момент времени у транспортного средства может быть ноль, один или максимум два водителя. мои текущие настройки моделей позволяют иметь более двух водителей на одном транспортном средстве. Как я могу ограничить количество водителей до двух на транспортное средство?

мои текущие модели

class DriverStatus(models.Model):
status = models.CharField(max_length=200)
def __str__(self):
    return f'{self.status}'



class Driver(models.Model):
    name = models.CharField(max_length=200)
    driver_num = models.IntegerField()
    profile_image = models.ImageField(default="default.jpg",upload_to="images")
    status = models.ForeignKey(DriverStatus, on_delete=models.CASCADE)
    current_vehicle = models.ForeignKey(Vehicle, on_delete=models.SET_NULL,null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f'{self.name}'


class Vehicle(models.Model):
    vehicle_number = models.CharField(max_length=200)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    def __str__(self):
        return f'{self.vehicle_number

1 Ответ

1 голос
/ 25 января 2020

Вы не можете сделать это на уровне базы данных. Но вы можете добавить валидацию модели: https://docs.djangoproject.com/en/3.0/ref/validators/

Или вы можете провести валидацию в чистом методе вашей модели: Проверять ограничение count () во многих отношениях до многих раньше сохранение экземпляра в django


Добавьте это в классе драйверов:

  def clean(self):
    cleaned_data = super(Driver, self).clean()
    vehicle = self.cleaned_data.get('current_vehicle')
    if not vehicle:
        return cleaned_data
    drivers_count = Driver.objects.filter(current_vehicle=vehicle).exclude(pk=self.instance.pk).count()
    if drivers_count >= 2:
      raise ValidationError('Maximum drivers reached')
    return cleaned_data

Я не проверял, но это идея!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...