Django难以在save方法中保存多个模型对象

时间:2013-04-03 07:54:41

标签: django django-models

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

我有一个适用于日历活动的模型:

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)

然而,我发现的真正问题是使用这种方法并从Admin表单中保存,它正在创建重复发生的事件,但如果我尝试获取自我。患者这是一个M2M字段,我会不断收到此错误:

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

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

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

IOW,如果你有事可做,这取决于m2m的设置,你必须把它放在一个不同的方法中,并确保在适当的时候调用该方法

关于您的代码段:

1 / recurrence_rules = EventSeries.objects.get(pk=self.event_series.pk)只是多余的,因为你的名字self.event_series

下的对象非常相同

2 /无需使用save为您创建的事件调用Event.objects.create - ModelManager.create方法确实创建一个实例(即:save它到数据库)。