如何解决将 ManyToMany Field 对象添加到信号创建的模型实例上的信号
概念:
我正在尝试创建一个目标类型的应用程序,其工作方式如下:
用户创建目标周(提示从预先设定的目标列表中进行多项选择)并点击“创建目标周”。
当用户创建目标周时,django 信号会自动为以下模型生成模型实例:GoalDayOne、GoalDayTwo、GoalDayThree、GoalDayFour、GoalDayFive,并且这些实例中的每一个都与 GoalWeek 具有一对一关联,就像您的典型的用户/配置文件信号关系。我有这部分工作。
现在是棘手的部分:当用户建立一个 GoalWeek 实例时——并且信号创建了 GoalDayOne、GoalDayTwo...等等——实例,我也想将这些预先选择的目标传递给每一天。我知道在信号中处理来自 M2M 字段的项目并不容易,但必须有一种方法来做到这一点,对吗?
我尝试从signals.py 文件切换到在models.py 上处理它,但没有成功。 我还摆弄了 m2m_changed 信号,但没有运气。 我假设我可以在传统的 post_save 信号上执行此操作,但我必须先将 GoalItems 建立为独立列表,然后再将它们添加到 GoalDayOne 实例,但不确定。
示例
Joe 打开应用并点击“创建新的目标周”
Joe 被提示从列表中选择几个目标项目。
他选择['跑步'、'喝水'、'阅读']
乔点击确认按钮开始他的目标周。
Joe 在目标日#1 跑步后重新访问该应用,并将当天的跑步目标标记为完成
他在第一天阅读和喝水后做同样的事情。
在第 2 天他忘记跑步,因此第 2 天的跑步状态仍未完成。
在第 5 天之后,该应用会对其目标成功率和其他内容进行分析。
((((我几乎可以完成所有这些功能,但我无法弄清楚用户如何在一周开始时指出他们选择的目标,然后让这些目标在一周中的每一天都显示出来。. . 以及如何让这些目标也带有“is_complete=False”字段。)))
- GoalWeek 和 GoalDay 的日期无关紧要。出于命名原因,我只有一个 DateField
- 总会有 5 个目标日
models.py
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)'
signals.py
@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 ?&?&?&?&?&?&?&&?')
print(instance) >>> 打印出来 >>> 2021-05-24 --> 2021-05-28
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。