Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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_Validation_Model_Many To Many - Fatal编程技术网

Python Django模型-多对多模型中至少有一个

Python Django模型-多对多模型中至少有一个,python,django,validation,model,many-to-many,Python,Django,Validation,Model,Many To Many,如何确保至少设置了一个多对多关系 例如:如果我有一个列表模型,它有一个与图像有多对多关系的图像字段。如何确保至少设置了一个图像 额外问题:如果最小值不是一个呢?最大值是多少?您可以实现一个函数来检查列表实例是否至少有一个映像实例,并将该函数连接到列表模型的 它类似于(假设您使用的是django 1.3) 您需要实现您自己的异常 以下是对PO进一步问题的回复 实现Listing.clean()是实现相同验证规则的另一种方法。实际上,这是语义正确的方法,因为Model.clean()用于自定义模型验

如何确保至少设置了一个多对多关系

例如:如果我有一个
列表
模型,它有一个与
图像
有多对多关系的图像字段。如何确保至少设置了一个图像


额外问题:如果最小值不是一个呢?最大值是多少?

您可以实现一个函数来检查
列表
实例是否至少有一个映像实例,并将该函数连接到
列表
模型的

它类似于(假设您使用的是django 1.3)

您需要实现您自己的异常

以下是对PO进一步问题的回复

实现
Listing.clean()
是实现相同验证规则的另一种方法。实际上,这是语义正确的方法,因为
Model.clean()
用于自定义模型验证。但是采用这种方法不太方便-要触发
clean()
,您必须在调用列表实例的
save()
之前手动调用
full\u clean()
(如果不使用模型表单),或者手动调用
is\u valid()
(使用模型表单时)

另一方面,使用
pre_save
信号方法,您可以确定,只要在实例上调用
save()
,验证规则总是应用于
列表
实例


选择一个而不是另一个并不是对或错,只是一个设计决策。这两种方法都可以满足您的需要,并将业务/领域逻辑(即您的验证规则)保留在模型层。

您所说的“确保”是什么意思?除非有所需数量的图像,否则禁止保存?是的,请确保至少有一个图像存在(如果可能的话,还有一个最大值),是否需要它来筛选列表或其他地方?过滤时,您可以使用注释并按结果编号进行过滤。根据[此答案][1],这是不可能的。[1] 当前位置我对phython/django很陌生。是否在字段验证之前(例如,在确保整数字段为整数或外键约束匹配之前)运行pre_save?为什么预保存而不清理()?使用clean()时,我是覆盖字段验证还是扩展字段验证?谢谢你的帮助@RS7-不用担心。每个人都在这里学习,包括我自己。我已经补充了我的回答,以回答您进一步的问题。谢谢,信息非常丰富--最后一个问题:如果
列表
模型有许多由
图像
模型表示的图像,该怎么办。如果我正确理解了文档,而不是许多字段
图像
,我会创建一个单独的模型是吗?那么,为了检查是否满足最低要求,我会以相同的方式访问它吗
self.image.count()
如果我是在
clean()
?@RS7中做的-这要看情况而定。如果您只需要一个简单的manytomany关系(即不需要记录有关关联的其他属性),那么您只需要一个
ManyToManyField
。比如说,您决定在关联上设置一个到期日期(即附加属性),那么您需要一个
ManyToManyField
,外加一个表示关联/关系的附加模型。我强烈建议你过去看看。第一段基本上重申了我刚才解释的内容。@RS7-是的,
self.image.count()
仍然适用于
clean()
from django.db.models.signals import pre_save
from django.dispatch import receiver
from myapp.models import Listing
...
@receiver(pre_save, sender=Listing)
def check_image_requirement(sender, instance, **kwargs):
    if instance.images.count() == 0:
        raise your_own_exception("Listing is required to have at least one image")