Django:创建新容器时使用子模型初始化容器模型 - 例如带有默认任务的待办事项列表

Django: Initialize a container model with child models when a new container is created - e.g. Todo list with default tasks

我正在尝试创建一个待办事项列表作为应用程序的一部分,用于提示用户在评估应用程序之前他们必须完成什么。为此,我创建了一个 TaskList 模型和一个属于 TaskList 的 Task 模型。

当我(在新应用程序上)创建新的 TaskList 实例时,我想用一些默认任务预填充列表,这些任务将始终存在于每个新应用程序中。我对 Django 和 Python 比较陌生,所以我只是在寻找正确的方向。

是否有某种 Django 模型初始化函数我可以在 TaskList 上覆盖以创建这些默认任务?

编辑:Django 模型字段

class AssessmentTaskList(models.Model):
    title = models.CharField(max_length=140)
    assessment = models.ForeignKey(Assessment, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)


class Task(models.Model):
    title = models.CharField(max_length=140)
    task_list = models.ForeignKey(AssessmentTaskList, on_delete=models.CASCADE)
    created_on = models.DateTimeField(auto_now_add=True)
    due_date = models.DateField(blank=True, null=True)
    completed = models.BooleanField(default=False)
    completed_date = models.DateField(blank=True, null=True)
    created_by = models.ForeignKey(User, limit_choices_to={
        'groups__name': 'Assessment Staff'}, on_delete=models.SET_NULL, null=True, related_name="applicant_task_created_by")
    system_created = models.BooleanField(default=False)
    note = models.TextField(blank=True, null=True)
    priority = models.PositiveIntegerField(blank=True, null=True)
    created_on = models.DateTimeField(auto_now_add=True)
    last_modified = models.DateTimeField(auto_now=True)
    staff_task = models.BooleanField(default=False)

您可以使用 manage.py loaddata fixturefile.json:

加载初始数据 along with migrations or provide separate fixtures

https://docs.djangoproject.com/en/dev/howto/initial-data/

只要您只是填充首字母而不以某种方式更改现有数据,我建议您使用固定装置。在这种情况下,初始加载将是一个可选步骤,并且可以在 production/testing 环境中省略(迁移始终是强制执行的)。

编辑:实际上您需要的是利用 Django Signals (specifically django.db.models.signals.post_save 模型信号的功能):

@receiver(post_save, sender=AssessmentTaskList)
def pre_populate_tasks(sender, instance: AssessmentTaskList, created: bool = False, **kwargs):
    if created:
        # put the pre-filled tasks here
        default_tasks = [Task(task_list=instance, ...)]
        Task.objects.bulk_create(default_tasks)