Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django中的强制一对多关系_Python_Django_Python 3.x_Django Models_Django Rest Framework - Fatal编程技术网

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。