0

我有以下 Django 模型:-

class Company(models.Model):
    name = models.CharField(max_length=50)
    is_active = models.BooleanField(db_index=True)

class Phase(models.Model):
    company = models.ForeignKey(Company)
    name = models.CharField(max_length=50)
    is_active = models.BooleanField(db_index=True)

class Process(models.Model):
    company = models.ForeignKey(Company)
    name = models.CharField(max_length=50)    
    phases = models.ManyToManyField(Phase, through='ProcessPhase')
    is_active = models.BooleanField(db_index=True)

class ProcessPhase(models.Model):
    process = models.ForeignKey(Process)
    phase = models.ForeignKey(Phase)
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?", unique=True)

一个“公司”有它的“过程”和“阶段”。(公司的)流程由(公司的)一个或多个阶段组成。与流程相关的每个阶段都有一个“顺序”。要求是: -

  1. 在公司的特定流程中,一个阶段只能出现一次;
  2. 进程中的“阶段A”和“阶段B”也不能具有相同的顺序。

所以我需要知道:-

a) 如何在模型定义中指定一些“唯一”来满足上述要求;

b) ManyToManyField 自动暗示了哪些唯一性(如果有)?

4

2 回答 2

3

就您而言,由于您说“(公司的)流程由(公司的)一个或多个阶段组成”,因此您似乎应该具有如下结构:

Company <----* Process <----* Phase

公司有它的流程,流程有它的阶段。这不是真正的ManyToMany关系,它是OneToMany(流程有许多阶段,但每个阶段都连接到一个流程)。

如果是这样,你应该有

class Phase(models.Model):
    process = models.ForeignKey(Process, null=True) # based on your comment, if a Phase does not belong to a Process, leave it null.
    phase = models.ForeignKey(Phase)
    order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?")


    class Meta:
        unique_togather = ("process", "order")

我想unique_togetherMeta课堂上是你想要的。它在管理员和数据库级别强制执行这两个字段的唯一性。


编辑:(
字段ForeignKey可以为空 - 看到这个


根据您的评论:

不要使用ManyToMany,因为它会自动生成“中间表”,而您需要它来满足您的需求。相反,请尝试定义不同的模型(连同您的Company,PhaseProcess):

class PhaseOrder(models.Model):
  process = models.ForeignKey(Process)
  phase = models.ForeignKey(Phase)
  order = models.PositiveIntegerField(help_text="At what step of your process will this phase occur?")
  class Meta:
    unique_together = (("process", "order"), ("process", "phase"))
于 2009-11-19T10:18:42.587 回答
1

一个阶段不应该总是属于一个过程吗?如果是这样,您可以说一个阶段的流程和顺序组合应该是唯一的。

于 2009-11-19T10:07:14.577 回答