2016-12-04 4 views
0

Я пытаюсь реализовать следующую модель данных в приложении Django:Джанго One-To-One и One-ко-многим отношениям

Проект состоит из 3-х контейнеров: 1) Осуществимое 2) Ссылки 3) Backburner

Ввод может быть создан в рамках проекта и должен быть привязан к любому из контейнеров (он не может оставаться свободно плавающим).

Следовательно, проект всегда содержит три контейнера, любой из которых может быть пустым. Вход всегда находится в одном (и только одном) контейнере. Однако запись может быть переключена из контейнера в контейнер.

Вот моя попытка. Это вообще разумно?

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

Вы можете использовать простой 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) 
+0

Я вижу. Есть ли способ обеспечить создание контейнеров при создании проекта? Или я должен создать контейнер для проекта, если там будет перемещена запись? – MadPhysicist

+1

Контейнер больше не является отдельной моделью, это просто поле символов в модели «Entry», а 'Entry' имеет' ForeignKey' непосредственно в 'Project'. Нет необходимости создавать контейнеры отдельно. – knbk

+0

Понял. Спасибо! – MadPhysicist

Смежные вопросы