当我想使用它时,相关对象还没有在DB中

时间:2015-08-04 18:55:00

标签: django django-models

我目前正在为Google Calendar API编写一个包装的django应用程序。 (我的计划是让它成为开源的,如果我能正确地完成它。)

django网站的用户可以作为访客添加到活动中,此操作将同步到Google日历。以下是相关的代码:

class Event(models.Model):

    def _convert_to_gcal_data(self):
        # removed some code here ...

        # and the interesting bit is
        for attendee in self.attendee_set.all():
            data['attendees'].append({
                'displayName': attendee.user.name,
                'email': attendee.user.email,
                'responseStatus': attendee.response_status,
            })
        return data

    def update_to_gcal(self):
        """
        Updates the remote event db from local data
        :return:
        """
        service = cal_utils.get_service(settings.GOOGLE_CAL_USER, settings.GOOGLE_CAL_CERT)
        data = self._convert_to_gcal_data()
        return service.events().update(calendarId=self.calendar.cal_id, eventId=self.ev_id, sendNotifications=False, body=data).execute()

    def register_user(self, user):
        self.attendee_set.create(user=user, response_status='accepted')
        self.update_to_gcal()

尽管创建方法在attendee_set中创建了用户,但attendee_set.all()中对_convert_to_gcal_data的调用会返回一个空的查询集。我猜创造还没有提交。

我如何解决django的这种行为?

更新

更仔细地检查我的测试,我发现只有当我从视图中调用register_user方法时才会出现所描述的行为,而不是像我在测试中那样直接调用它。

1 个答案:

答案 0 :(得分:0)

问题出在视野中。我在assignee_set上执行了相关的预取,这导致在受理人集更改后不会重新评估。

从视图代码中删除相关的预取解决了这个问题。