Django一对一和一对多关系

时间:2016-12-04 20:12:06

标签: python django model-view-controller model foreign-keys

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

项目包含3个容器: 1)可行 2)参考文献 3)Backburner

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

因此,Project始终包含三个容器,其中任何容器都可以为空。条目总是在一个(并且只有一个)容器中。但是,Entry可以从容器切换到容器。

这是我的尝试。这一点合理吗?

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)  

1 个答案:

答案 0 :(得分:1)

您可以使用简单的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)