gpt4 book ai didi

python - Django ManytoMany字段重复,属性错误: 'ManyRelatedManager'

转载 作者:太空宇宙 更新时间:2023-11-03 19:21:50 25 4
gpt4 key购买 nike

共有三种模型:House_Type、House_Option 和 Order

House_Type 模型有 2 个字段:id 和 name

House_Option 有 3 个字段:id、name 和 type,其中 type 是链接到 House_Type 的外键。

最后,Order 由许多字段组成,其中一个是称为“choice”的 ManytoMany 字段,它链接到 House_Option

其工作方式是 House_Type 有不同的房屋“类型”:例如公寓、公寓、独立式住宅、半独立式住宅等。

House_Option 具有每种类型的所有可能选项:例如,对于“公寓”类型,选项 1 位于街道 X,选项 2 位于街道 Y 等等。

在订单模型中,用户必须为每种房屋“类型”选择一个“选项”。因此,他们必须选择一种公寓选项、一种房屋选项等。因为这是一个多对多字段,所以这是可能的。然而我的问题是:如何防止用户选择两个“公寓”选项。我如何限制他们只选择其中一个(或不选择)?

我试图在订单模型中创建一个 def(clean):

        def clean(self):
if self.choice.house_option_type.count() > 1:
raise ValidationError('Custom Error Message')

但这会返回属性错误:“ManyRelatedManager”对象没有属性“house_option_type”

有什么想法吗?

最佳答案

通过显式定义的模型管理多对多关系,其中每个订单的两个外键都是唯一的。您可以使用 unique_together 来执行此操作对相同类型的多对多关系施加唯一性约束。

 class House_Type(models.Model):
name = models.CharField(...)


class House_Option(models.Model):
name = models.CharField(...)
type = models.ForeignKey(House_Type)

class Order(models.Model):
...
choices = models.ManyToManyField(House_Option, through='Order_options')
...

class Order_options(models.Model):
class Meta:
unique_together = ('order', 'option__type')

...
order = models.ForeignKey(Order)
option = models.ForeignKey(House_Option)
...

编辑、更新语法和更正。

是的,看起来 unique_together 被应用为表上的数据库约束,并且不能跨表工作。所以忘记上面的方法吧。

我仍然认为以下应该有效:

如果您只是覆盖validate_unique在 Order_options 上并自己实现唯一性逻辑,同时小心如何处理它应该起作用的现有和不存在的情况。

from django.core.exceptions import ValidationError, NON_FIELD_ERRORS

class Order_options(models.Model):
...
def validate_unique(self, exclude = None):
super(Order_options, self).validate_unique(exclude)

options = { 'order__id' : self.order.id, 'option__type' : 'self.option.type' }
objs = Order_options.objects.exclude(id=self.id) if self.id else Order_options.objects
if objs.filter(**options).exists():
raise ValidationError({NON_FIELD_ERRORS: ['Error: {0} option type already exists'.format(self.option.type)]})
...

关于python - Django ManytoMany字段重复,属性错误: 'ManyRelatedManager' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446480/

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