gpt4 book ai didi

python - Django:将 "same parent"约束应用于映射到自身的 ManyToManyField

转载 作者:行者123 更新时间:2023-11-28 16:54:52 24 4
gpt4 key购买 nike

我有一个模型,其中任务是工作的一部分,每个工作都可能依赖于一定数量的其他任务来完成才能开始。任务被分组为作业,我想禁止作业之间的依赖关系。这是我的模型的相关子集:

class Job(models.Model):
name = models.CharField(max_length=60, unique=True)

class Task(models.Model):
job = models.ForeignKey(Job)
prerequisites = models.ManyToManyField(
'self',
symmetrical=False,
related_name="dependents",
blank=True)

有什么方法可以表达所有先决条件任务必须具有相同作业的约束?我可以在 View 级别强制执行此操作,但我真的很想让它在模型级别工作,以便管理界面在选择任务的先决条件时显示适当的选项。我以为我可以使用“limit_choices_to”,但仔细检查它似乎需要一个静态查询,而不是依赖于此任务对象中的值的东西。

最佳答案

这里有两个不同的问题。

如果你想在模型级别强制执行此约束,你可能必须定义一个显式的“通过”模型并覆盖它的 save() 方法(你不能只覆盖 Task.save() 因为那不是必须调用以将条目添加到 M2M)。 Django 1.2 将有一个更完整的模型验证框架,更像表单验证。

如果您只希望某些选项出现在管理中,那是表单级别的问题。您可以在表单的 init 方法中动态设置 ModelMultipleChoiceField 的 queryset 属性:

class TaskForm(forms.ModelForm):
class Meta:
model = Task

def __init__(self, *args, **kwargs):
super(TaskForm, self).__init__(*args, **kwargs)
self.fields['prerequisites'].queryset = Task.objects.filter(job=self.instance.job)

您可能需要在此处引入一些额外的检查来处理创建新任务的情况(在这种情况下,“self.instance.job”可能为 None);您想要的可用先决条件集没有明确定义,因为新任务还没有工作。

关于python - Django:将 "same parent"约束应用于映射到自身的 ManyToManyField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1531065/

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