Как позволить пользователю создавать поля и сохранять записи как списки выбора? - Джанго каркас отдыха - PullRequest
0 голосов
/ 28 марта 2019

Я хотел бы создать систему управления, когда я создаю Project, проект содержит много TaskGroup, таких как «To», «Doing» и «Done», и который является типом по умолчанию TaskGroup называется DefaultTaskGroup, и администратор может создать несколько других TaskGroup с различными полями CharField, TextField, DateTimeField, Single или Multiple Choice. и т. д., которые будут сохранены как TaskGoup1 with new field 1 and new field 2, TaskGroup2 with new field 3 and new field 4, если я создал новыйзадача, я могу выбрать тип TaskGroup из списков групп задач (группа задач по умолчанию, TaskGroup1 и TaskGroup2).

Я создал частичные модели, как показано ниже, они не правы, но я озадачен структурой базы данных,Спасибо за чтение, и любые советы будут высоко оценены.

class TaskGroupType(models.Model):
    name = models.CharField(max_length=58, null=True)

    def __str__(self):
        return self.name


class Project(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    owner = models.ForeignKey(
        UserProjectOwners, null=True, blank=True,
        on_delete=models.CASCADE, related_name='Owner'
    )
    name = models.CharField(max_length=100)
    desc = models.CharField(max_length=200, null=True, blank=True)
    category = models.CharField(max_length=100, null=True, blank=True)
    members = models.ForeignKey(
        UserProjectTeam, null=True, blank=True,
        on_delete=models.CASCADE, related_name="project"
    )
    tasktype = models.ManyToManyField(TaskType)

    class Meta:
        ordering =['created']
        verbose_name = "User Table"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class TaskGroup(models.Model):
    created = models.DateTimeField(auto_now_add=True)
    name = models.CharField(max_length=280, blank=True)
    order = models.IntegerField(null=True, blank=True)
    project = models.ForeignKey(
        Project,
        related_name='taskgroups', null=True, blank=True,
        on_delete=models.CASCADE
    )

    class Meta:
        ordering =['created']
        verbose_name = "Task Group"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

class Task(models.Model):
    SORT_TYPE = (
        (1, "Normal"),
        (2, "Urgent"),
        (3, "Very Urgent"),
    )
    createDate = models.DateTimeField(auto_now_add=True)
    tasklist = models.ForeignKey(
        TaskList,
        related_name='tasks', null=True, blank=True,
        on_delete=models.CASCADE
    )
    completed = models.BooleanField(default=False)
    accomplished = models.DateTimeField(null=True, blank=True)
    desc = models.CharField(max_length=380, blank=True)
    name = models.CharField(max_length=180, blank=True)
    performer = models.ForeignKey(
        User,
        related_name='Task', null=True, blank=True,
        on_delete=models.CASCADE
    )
    participant = models.ManyToManyField(
        User,
        related_name='+'
    )
    startDate = models.DateTimeField(null=True, blank=True)
    dueDate = models.DateTimeField(null=True, blank=True)
    priority = models.CharField(max_length=100, choices=SORT_TYPE, null=True, blank=True)
    order = models.IntegerField(null=True, blank=True)
    remark = models.CharField(max_length=400, null=True, blank=True)

    class Meta:
        ordering =['createDate']
        verbose_name = "Task Table"
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.name

1 Ответ

0 голосов
/ 29 марта 2019

Согласно моему пониманию вашего проекта

  1. Пользователь может создать проект
  2. Проект может иметь несколько задач
  3. Каждая задача принадлежит группе задач
  4. Каждый проект может иметь несколько участников.

Если приведенный выше вариант использования подходит. Вот мои модельные экземпляры.

class TaskGroup(models.Model):
    name = models.CharField()
    ...

class Task(models.Model):
    task_group = models.ForeignKey(TaskGroup)
    name = models.CharField()
    ...

class Project(models.Model):
    owner = models.ForeignKey(User)
    name = models.CharField()
    ...

class ProjectTask(models.Model):
   project = models.ForeignKey(Project)
   task = models.ForeignKey(Task)
   ...

  # You can use Many field in Project model for Task reference if this model is not needed

class ProjectMember(models.Model):
    project = models.ForeignKey(Project)
    member = models.ForeignKey(User)
    ...

    # You can use Many field in Project model instead if this model is not required

Наличие отдельной модели для ассоциации добавляет гибкости для управления каждой ассоциацией отдельно и могут быть добавлены дополнительные параметры.

Пример содержит только ассоциацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...