【问题标题】:Django difficulty saving multiple model objects within save methodDjango难以在保存方法中保存多个模型对象
【发布时间】:2013-04-03 07:54:40
【问题描述】:

这是一个很难描述的问题,但我会在这里尽力而为。

我有一个用于日历事件的模型:

class Event(models.Model):
    account = models.ForeignKey(Account, related_name="event_account")
    location = models.ForeignKey(Location, related_name="event_location")
    patient = models.ManyToManyField(Patient)
    datetime_start = models.DateTimeField()
    datetime_end = models.DateTimeField()
    last_update = models.DateTimeField(auto_now=False, auto_now_add=False, null=True, blank=True)
    event_series = models.ForeignKey(EventSeries, related_name="event_series", null=True, blank=True)
    is_original_event = models.BooleanField(default=True)

保存后,我将覆盖 save() 方法来检查是否设置了 event_series(重复事件)。如果是,那么我需要为每个循环日期迭代地创建另一个事件对象。

以下方法似乎可行,尽管它可能不是最好的方法:

def save(self,  *args, **kwargs):
    if self.pk is None:
        if self.event_series is not None and self.is_original_event is True :
            recurrence_rules = EventSeries.objects.get(pk=self.event_series.pk)

            rr_freq = DAILY                    
            if recurrence_rules.frequency == "DAILY":
                rr_freq = DAILY
            elif recurrence_rules.frequency == "WEEKLY":
                rr_freq = WEEKLY
            elif recurrence_rules.frequency == "MONTHLY":
                rr_freq = MONTHLY
            elif recurrence_rules.frequency == "YEARLY":
                rr_freq = YEARLY

            rlist = list(rrule(rr_freq, count=recurrence_rules.recurrences, dtstart=self.datetime_start))

            for revent in rlist:
                evnt = Event.objects.create(account = self.account, location = self.location, datetime_start = revent, datetime_end = revent, is_original_event = False, event_series = self.event_series)
                super(Event, evnt).save(*args, **kwargs)          

    super(Event, self).save(*args, **kwargs)

但是,我发现的真正问题是,使用这种方法并从管理表单中保存,它会创建重复事件,但是如果我尝试获取 self.patient 这是一个 M2M 字段,我会不断收到此错误:

'Event' instance needs to have a primary key value before a many-to-many relationship can be used

我的主要问题是关于这个 m2m 错误,但如果您对重复事件的嵌套保存有任何反馈,那也很好。

非常感谢!

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    如果尝试访问self.patient 的代码在save 方法中并且发生在实例被保存之前,那么这显然是预期的行为。请记住,模型对象只是 SQL 数据库上的一个薄(嗯...)包装器...此外,即使您首先保存新实例然后尝试从保存方法访问 self.patient,您仍然会有一个空的查询集,因为管理表单尚未保存 m2m。

    IOW,如果您需要做的事情取决于设置的 m2m,您必须将它放在一个不同的方法中,并确保在适当的时候调用该方法

    关于你的代码 sn-p:

    1/ recurrence_rules = EventSeries.objects.get(pk=self.event_series.pk) 只是多余的,因为您已经在名称 self.event_series 下拥有相同的对象

    2/ 对于您使用Event.objects.create 创建的事件,无需调用save - ModelManager.create 方法确实创建 一个实例(即:将其保存到数据库中)。

    【讨论】:

    • 谢谢布鲁诺!我在 1 中看到了明显的冗余。:) 感谢您指出这一点。
    • 另外,我可以设置另一种添加 M2M 的方法,但它应该去哪里以及如何调用它以确保它在保存后立即运行?
    • 有人能解决这个问题吗?我也问过同样的问题here
    猜你喜欢
    • 1970-01-01
    • 2021-03-24
    • 2015-08-03
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2023-02-09
    • 2021-05-14
    • 2017-04-22
    相关资源
    最近更新 更多