Django模型不通过save_model方法保存更改

时间:2017-02-26 16:27:37

标签: django django-admin

我已经覆盖了admin save_model函数,根据我添加到管理站点的自定义按钮执行一些额外的逻辑。 save_model函数如下所示:

def save_model(self, request, obj, form, change):
    obj.last_updated = timezone.now()
    send_request = False

    if request.method == 'POST' and "text_gig" in request.POST:
        if not obj.status:
            obj.status = Event.APPROVED

            send_request = True 

            messages.success(request, 'Event has been approved and tweeted!')

        elif _check_tweet(request, form, obj):
            if change:
                obj.tweet = form.cleaned_data.get('tweet')

            send_request = True

            messages.success(request, 'Event has been tweeted!')

        obj.save()
        if send_request:
            send_text.delay(obj.id, phone=False)

实例" last_updated"应该改变到当前时间,以及"状态"字段应该从NULL设置为定义的常量。但是,这种情况并没有发生。我知道代码流是正确的,因为我收到了"事件已被批准和发推文!"消息,因为我的" send_text"任务正在解雇。此外,我从调试日志输出显示SQL UPDATE:

UPDATE `booking_event` SET `reference` = '046A', `recorded` = '2017-02-26 15:59:29', `customer_id` = 1, `start` = '2017-02-28 17:00:00', `end` = '2017-02-28 20:00:00', `num_bartenders` = 1, `rate` = '20.00', `location` = 'xxx', `attendees` = 100, `description` = 'dsd', `special_requests` = 'dsd', `minimum_training_id` = 2, `contracted` = NULL, `assigned` = NULL, `signed` = NULL, `last_updated` = '2017-02-26 16:16:12', `agreement_id` = NULL, `tweet` = '046A: Tuesday 02/28, 12:00 PM-03:00 PM. 1B. xxx', `last_tweeted` = '2017-02-26 16:14:54', `contract_number` = 0, `status` = 1, `echosign_used` = 0, `booked_as_name` = 'xxx', `booked_as_phone` = 'xxx' WHERE `booking_event`.`id` = 46; args=(u'046A', u'2017-02-26 15:59:29', 1, u'2017-02-28 17:00:00', u'2017-02-28 20:00:00', 1, u'20.00', u'xxx', 100, u'dsd', u'dsd', 2, u'2017-02-26 16:16:12', u'046A: Tuesday 02/28, 12:00 PM-03:00 PM. 1B. xxx', u'2017-02-26 16:14:54', 0, 1, False, u'xxx', u'xxx', 46)

请注意'状态'这里设置为1.但是,当我浏览实例的更改表单时," status"回到NULL。这是非常令人困惑的,因为SQL清楚地表明它正在执行一个状态为'状态的UPDATE查询。设为1。

当我加载shell并手动进行更改时,它可以工作。我觉得我错过了一些明显但却无法解决的问题!谢谢!

----更新-----

我更接近源并启用了数据库上的事务日志记录。这些日志的转储显示正在进行的第二次UPDATE调用正在恢复我的更改!

UPDATE `booking_event` SET `reference` = '046A', `recorded` = '2017-02-26 15:59:29', `customer_id` = 1, `start` = '2017-02-28 17:00:00', `end` = '2017-02-28 20:00:00', `num_bartenders` = 1, `rate` = '20.00', `location` = 'xxx', `attendees` = 100, `description` = 'dsd', `special_requests` = 'dsd', `minimum_training_id` = 2, `contracted` = NULL, `assigned` = NULL, `signed` = NULL, `last_updated` = '2017-02-26 16:03:01', `agreement_id` = NULL, `tweet` = 'xxx', `last_tweeted` = '2017-02-26 16:36:48', `contract_number` = 0, `status` = NULL, `echosign_used` = 0, `booked_as_name` = 'xxx', `booked_as_phone` = 'xxx' WHERE `booking_event`.`id` = 46

注意"状态"此查询返回NULL。知道是什么导致查询执行吗?

1 个答案:

答案 0 :(得分:0)

自己弄清楚:)" send_text"我调度的任务也称为实例的save()方法,它引入了竞争条件。如果任务在保存完成之前获取了实例,则状态将被覆盖。

我通过将所有保存逻辑移动到admin save_model方法来修复此问题。