Python Django中的强制一对多关系
假设我有一辆车型Python Django中的强制一对多关系,python,django,python-3.x,django-models,django-rest-framework,Python,Django,Python 3.x,Django Models,Django Rest Framework,假设我有一辆车型拥有的汽车(汽车是拥有的,不是乘客共享的)和一辆车型乘客(乘客包括公共汽车的司机)。模型可通过和管理接口进行读/写 如何确保每辆车至少有一名乘客,并且可能有多名乘客(强制一对多关系)?在创建模型之前,我必须如何/在何处执行验证?从您应该使用model.clean() 此方法应用于提供自定义模型验证,并 如果需要,修改模型上的属性。例如,你可以 使用它自动为字段提供值,或执行以下操作 需要访问多个字段的验证 您的代码应该如下所示 class Car(models.Model):
拥有的汽车
(汽车是拥有的,不是乘客共享的)和一辆车型乘客
(乘客包括公共汽车的司机)。模型可通过和管理接口进行读/写
如何确保每辆车至少有一名乘客,并且可能有多名乘客(强制一对多关系)?在创建模型之前,我必须如何/在何处执行验证?从您应该使用model.clean()
此方法应用于提供自定义模型验证,并
如果需要,修改模型上的属性。例如,你可以
使用它自动为字段提供值,或执行以下操作
需要访问多个字段的验证
您的代码应该如下所示
class Car(models.Model):
...
def clean(self):
if self.passangers.count() == 0:
raise ValidationError(_('Car cannot be empty'))
if self.passangers.filter(type='Driver').count() == 0:
raise ValidationError(_('You need at least one driver in the car.'))
阅读这是在序列化程序中验证数据的地方。@dirkgroten谢谢!请注意,如果还希望在django admin中进行验证,则应在表单中进行验证(覆盖
ModelAdmin
中的表单)<普通Django中的code>Form相当于DRF中的Serializer
。这是假设carcreation表单与car信息的其余部分同时获得乘客和驾驶员的列表。否则,您想要的是不可能的,正如我在回答下面的评论中提到的,在保存car对象之前,您不能实际分配乘客。@dirkgroten我忘了提到我使用JS前端。但是因为我通过RESTful API集成了它,所以我想序列化程序中的验证应该可以完成这项工作。使用模型的clean()方法通常是一个不错的选择,但是对于一对多字段,这是行不通的,因为在创建乘客之前,应该已经创建并保存汽车(它的fk指向汽车
)。因此您的清除方法将始终失败(在保存汽车
之前调用该方法).请提供乘客
的代码,以确保完整性。@dirkgroten首先创建乘客
有什么问题?如果您希望能够创建空车,则没有必要验证汽车
@FilipMłynarski,强制我的意思是汽车
至少有一名相关的乘客
。这意味着只有在至少分配了一名乘客的情况下,才应该创建汽车模型。@FilipMłynarski我的假设是乘客拥有汽车的外键。即使fk可能是无,也就是说,你可以先创建乘客,你的清洁()
方法是否有效?在验证输入数据以创建汽车时调用该方法时,汽车
尚未保存,因此它没有pk。无法将乘客分配到汽车,因为汽车需要将pk分配给乘客
。因此self.passengers.count()
始终为0。