Django 信号将许多字段对象添加到信号创建的模型实例上

Django 信号将许多字段对象添加到信号创建的模型实例上,django,django-models,django-signals,Django,Django Models,Django Signals,概念: 我正在尝试创建一个目标类型的应用程序,其工作方式如下: 用户创建目标周,提示从预先建立的目标列表中多选,并点击“创建目标周” 当用户创建目标周时,django信号会自动为以下模型生成模型实例:GoalDayOne、GoalDayTwo、GoalDayThree、GoalDayFour、GoalDayFive,这些实例中的每一个都与GoalWeek有一个One关联,就像典型的用户/配置文件信号关系一样。我让这部分工作 现在有一个棘手的部分:当用户建立一个GoalWeek实例时——信号创建了

概念:

我正在尝试创建一个目标类型的应用程序,其工作方式如下:

用户创建目标周,提示从预先建立的目标列表中多选,并点击“创建目标周”

当用户创建目标周时,django信号会自动为以下模型生成模型实例:GoalDayOne、GoalDayTwo、GoalDayThree、GoalDayFour、GoalDayFive,这些实例中的每一个都与GoalWeek有一个One关联,就像典型的用户/配置文件信号关系一样。我让这部分工作

现在有一个棘手的部分:当用户建立一个GoalWeek实例时——信号创建了GoalDayOne、GoalDayTwo……等等——实例,我想把这些预先选择的目标也传递给每一天。我知道在信号机中处理M2M字段中的项目并不容易,但必须有办法做到这一点,对吗

我尝试过从signals.py文件切换到models.py上处理所有这些文件,但没有成功。 我还摆弄着m2m_改变的信号,而不是没有运气。 我假设我可以在传统的post_save信号上这样做,但我必须先将GoalItems建立为一个独立的列表,然后再将它们添加到GoalDayOne实例中,但不确定

范例

Joe打开应用程序并单击“创建新目标周”

提示Joe从列表中选择一些目标项

他选择【跑步】、【喝水】、【阅读】

乔点击确认按钮开始他的目标周

Joe在跑步后的目标日1重新访问应用程序,并将当天的跑步目标标记为完成

他在阅读和喝水后的第1天也这样做

第2天他忘记跑步,因此第2天的跑步状态仍然不完整

第5天之后,应用程序会对他的目标成功率和其他方面进行分析

我几乎可以实现所有这些功能,但我无法理解用户如何在一周开始时指出他们选择的目标,然后让这些目标在一周中的每一天都显示出来。。。如何让这些目标也包含一个“is_complete=False”字段

进球周和进球日的日期无关紧要。出于命名原因,我只有一个日期字段 总有5个进球日 models.py

signals.py

打印实例>>>打印出>>>2021-05-24->2021-05-28

class GoalItem(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True, null=True)
    is_complete = models.BooleanField(default=False)

    def __str__(self):
        return self.name

class CurrentGoalWeek(models.Model):
    week_start_date = models.DateField(auto_now_add=False)
    week_end_date = models.DateField(auto_now_add=False)
    choose_goals = models.ManyToManyField(GoalItem, blank=True, related_name=('choose_goals'))

    def __str__(self):
        return f'{self.week_start_date} --> {self.week_end_date}'

class DayOne(models.Model):
    goal_week = models.OneToOneField(CurrentGoalWeek, on_delete=models.CASCADE, related_name="goal_week")
    day_is_complete = models.BooleanField(default=False)
    day_one_goals = models.ManyToManyField(GoalItem, blank=True)

    def __str__(self):
        return f'{self.goal_week} (Day #1)'
@receiver(post_save, sender=CurrentGoalWeek)
def create_days(sender, instance, created, **kwargs):
    if created:
        DayOne.objects.create(
            goal_week = instance,
        )
        print(instance)
        print('?&?&?&?&?&   created new DayOne  ?&?&?&?&?&?&?&&?')