【问题标题】:Django ORM : restrict foreignkey relationship between models to limited number of timesDjango ORM:将模型之间的外键关系限制为有限的次数
【发布时间】:2020-01-25 18:44:52
【问题描述】:

我有两种模型:车辆和驾驶员。在任何给定时间点,一辆车可以有零个、一个或最多两个司机。我当前的模型设置允许在一辆车上拥有超过 2 名司机。如何将司机人数限制为每辆车只有两名?

我目前的模型

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

【问题讨论】:

标签: django orm


【解决方案1】:

您无法在数据库级别执行此操作。但是可以添加模型验证:https://docs.djangoproject.com/en/3.0/ref/validators/

或者您可以在模型的 clean 方法中进行验证: Validate count() constraint in many to many relation before saving an instance in django


在 Driver 类中添加:

  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

我没有测试过,但就是这样!

【讨论】:

  • 我理解了验证器的使用部分。在我的情况下,如果更多两个驱动程序已经映射到所选车辆,我的验证器(在驱动程序模型的 current_vehicle 中使用不当)应该抛出错误。然而,我。无法理解第二个链接以及如何获取已经映射到车辆的驾驶员数量以执行验证
  • 我加了一个例子
  • 这需要一些修改,但完全符合我的要求。非常感谢
猜你喜欢
  • 2020-10-22
  • 1970-01-01
  • 2014-11-27
  • 2014-09-14
  • 2016-05-05
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多