Django ManyToMany CheckConstraint IntegerField

发布于 2025-01-15 11:53:29 字数 753 浏览 1 评论 0原文

我有一些模型,1 个抽象模型,以及 2 个从具有多对多关系的抽象模型继承的模型。一个模型从另一个模型获取其成员。我想对此模型实现一个约束,以便其成员不能超过原始组中剩余成员的总和。我创建了一个 Q 表达式来表达我想要实现的目标,但我知道这不是正确的方法。如何使用与 ManyToMany 字段相关的模型创建约束?

class AbstractGroup(models.Model):
    members = models.IntegerField()
    
    class Meta:
        abstract=True

class OriginalGroup(AbstractGroup):
    remaining_members = models.IntegerField()
    new_group_members = ManyToManyField(NewGroup, related_name=new_group, related_query_name=new_group)


class NewGroup(AbstractGroup):
    name = models.CharField()

    class Meta:
        constraints = [
            models.CheckConstraint( Q(members__lte=original_groups__sum__remaining_members, name='%(app_label)s_%(class)s_available_members' ) )
        ]
    

I have some models, 1 abstract, and 2 that inherit from the abstract model with a ManyToMany relationship. One model gets its members from the other model. I want to implement a constraint on this model so that its members can't be more than the Sum of the remaining_members on the original groups. I created a Q expression that expresses what I want to achieve, but I know it's not the right way to do it. How can I create the constraint with models that are related by a ManyToMany field?

class AbstractGroup(models.Model):
    members = models.IntegerField()
    
    class Meta:
        abstract=True

class OriginalGroup(AbstractGroup):
    remaining_members = models.IntegerField()
    new_group_members = ManyToManyField(NewGroup, related_name=new_group, related_query_name=new_group)


class NewGroup(AbstractGroup):
    name = models.CharField()

    class Meta:
        constraints = [
            models.CheckConstraint( Q(members__lte=original_groups__sum__remaining_members, name='%(app_label)s_%(class)s_available_members' ) )
        ]
    

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文