Как разрешить пользователю создавать поля и сохранять записи в виде списков выбора? — Фреймворк Django rest

#database #dataframe #data-structures #model #django-rest-framework

#База данных #фрейм данных #структуры данных #Модель #django-rest-framework

Вопрос:

Я хотел бы создать систему управления, когда я создаю Project проект, содержащий множество TaskGroup таких как «To do», «Выполнение» и «Готово», и который является типом по умолчанию TaskGroup called DefaultTaskGroup , и администратор может создать какой-то другой TaskGroup с разными полями CharField, TextField, DateTimeField, Single or 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:

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

  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
  

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

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

Комментарии:

1. Привет, большое спасибо за ответы, но мне также нужно TaskGroupType сохранять разные TaskGroup шаблоны, ссылайтесь на фотографии как на ссылку d.pr/free/i/j3VO3z на первом рисунке указано значение по умолчанию TaskGoup , и я могу щелкнуть, Type чтобы выбрать другой TaskGroup шаблон, на третьем рисунке на три новых поля больше, чем на первом рисунке.

2. Вы можете соответствующим образом расширить ассоциацию. создайте TaskGroupType модель с внешним ключом к TaskGroup . Затем вы можете получить TaskGroupType для каждой целевой группы.

3.Привет, я действительно хотел принять ваш ответ, но мне действительно жаль, что это все еще не решает мой вопрос, когда пользователь добавляет шаблон с 3-6 полями по умолчанию, он также может добавить несколько пользовательских полей, вы знаете, как создать этот шаблон по умолчанию с пользовательскими полями? d.pr/free/i/40eZQM d.pr/free/i/0RdJy4

4. являются ли это полями формы? Вы хотите динамически добавлять поля формы?

5. Я не знаю, являются ли они полями формы, эти поля могут где-то добавляться и изменяться, поэтому я думаю, что это поля формы, да, я хочу динамически добавлять поля формы, но я не знаю, как добавлять и сохранять поля и шаблоны.