Django一对一和一对一的关系



我正在尝试在django应用中实现以下数据模型:

一个项目由3个容器组成:1)可操作2)参考3)发burner

可以在项目中创建一个条目,并且需要分配给任何一个容器(不能保持自由浮动)。

因此,一个项目始终包含三个容器,其中任何一个都可以为空。条目始终位于一个容器中的一个(也只有一个)中。但是,可以将条目从容器转换为容器。

这是我的尝试。这完全合理吗?

class Project(models.Model):
    project_title = models.CharField()
    created_date = models.DateTimeField('date created')
class References(models.Model):
    project = models.OneToOneField(
        Project,
        on_delete=models.CASCADE,
        primary_key=True,
    )
class BackburnerItems(models.Model):
    project = models.OneToOneField(
        Project,
        on_delete=models.CASCADE,
        primary_key=True,
    )
class ActionSteps(models.Model):
    project = models.OneToOneField(
        Project,
        on_delete=models.CASCADE,
        primary_key=True,
    )
class Entry(models.Model):
    title = models.CharField(max_length=200)
    description = models.CharField(max_length=200)
    action_steps = models.ForeignKey(ActionSteps)
    references = models.ForeignKey(References)
    backburner = models.ForeignKey(BackburnerItems)  

您可以使用具有选择的简单CharField将条目分配给特定容器:

class Entry(models.Model):
    REFERENCE = 'reference'
    BACKBURNER = 'backburner-item'
    ACTION_STEP = 'action-step'
    CONTAINER_CHOICES = (
        (REFERENCE, 'Reference'),
        (BACKBURNER, 'Backburner item'),
        (ACTION_STEP, 'Action step'),
    )
    container = models.CharField(choices=CONTAINER_CHOICES)
    project = models.ForeignKey('Project', on_delete=models.CASCADE)
    ...

您可以轻松查询属于特定容器的条目,无论是从Project实例还是从Entry类:

references = project.entry_set.filter(container=Entry.REFERENCE)

最新更新