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)
我正在尝试创建一个待办事项列表作为应用程序的一部分,用于提示用户在评估应用程序之前他们必须完成什么。为此,我创建了一个 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
:
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)