gpt4 book ai didi

django - 限制ManyToManyField的最大选择

转载 作者:行者123 更新时间:2023-12-01 23:35:45 33 4
gpt4 key购买 nike

我正在尝试限制模型记录在 ManyToManyField 中可以拥有的最大选择数量。

在此示例中,有一个可以与区域相关的 BlogSite。在此示例中,我想将 BlogSite 限制为只能有 3 个区域。

这似乎是以前被问过/回答过的问题,但经过几个小时的探索,我还没有找到任何接近的东西。对于这个项目,我使用 Django 1.3。

#models.py
class BlogSite(models.Model):
blog_owner = models.ForeignKey(User)
site_name = models.CharField(max_length=300)
region = models.ManyToManyField('Region', blank=True, null=True)
....

class Region(models.Model):
value = models.CharField(max_length=50)
display_value = models.CharField(max_length=60)
....

有什么想法吗?

最佳答案

您可以在 BlogSite 模型上重写 clean 方法

from django.core.exceptions import ValidationError

class BlogSite(models.Model):

blog_owner = models.ForeignKey(User)
site_name = models.CharField(max_length=300)
regions = models.ManyToManyField('Region', blank=True, null=True)

def clean(self, *args, **kwargs):
if self.regions.count() > 3:
raise ValidationError("You can't assign more than three regions")
super(BlogSite, self).clean(*args, **kwargs)
#This will not work cause m2m fields are saved after the model is saved

如果你使用 django 的 ModelForm 那么这个错误将出现在表单的 non_field_errors 中。

编辑:

M2m字段是在模型保存后保存的,所以上面的代码不起作用,正确的使用m2m_changed信号的方法:

from django.db.models.signals import m2m_changed
from django.core.exceptions import ValidationError


def regions_changed(sender, **kwargs):
if kwargs['instance'].regions.count() > 3:
raise ValidationError("You can't assign more than three regions")


m2m_changed.connect(regions_changed, sender=BlogSite.regions.through)

尝试一下,它对我有用。

关于django - 限制ManyToManyField的最大选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20203806/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com