代码之家  ›  专栏  ›  技术社区  ›  Weeble

Django:将“同一父项”约束应用于映射到自身的多个ManyToManyField

  •  3
  • Weeble  · 技术社区  · 15 年前

    我有一个模型,其中任务是工作的一部分,每个任务在开始之前可能需要完成一些其他任务。任务被分组到作业中,我不允许作业之间存在依赖关系。这是我的模型的相关子集:

    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)
    

    在视图级别强制执行此操作,但我确实希望它在模型级别工作,以便在为任务选择先决条件时,管理界面将显示适当的选项。我想我可以使用“limit_choices_to”,但仔细观察,它似乎需要一个静态查询,而不是依赖于这个任务对象中的值。

    1 回复  |  直到 15 年前
        1
  •  3
  •   Carl Meyer    15 年前

    这里有两个不同的问题。

    如果要在模型级别强制执行此约束,可能必须定义一个显式的“直通”模型并重写其save()方法(您不能只重写Task.save(),因为在向M2M添加条目时不必调用它)。Django1.2将有一个更完整的模型验证框架,更像表单验证。

    初始化

    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”可能没有);由于新任务还没有作业,所以您想要的可用先决条件集还没有明确定义。