2017-02-26 195 views
-1

我已经重写了admin save_model函数来根据我添加到管理站点的自定义按钮来执行一些额外的逻辑。该save_model功能如下所示:Django模型不保存通过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。然而,当我浏览到该实例的变化形式,“状态”是回NULL。这是超级混淆,因为SQL清楚地表明它正在执行UPDATE查询,并将'status'设置为1.

当我加载shell并手动进行更改时,它可以工作。我觉得我失去了一些明显的东西,但无法弄清楚这一点!谢谢!

---- ----- UPDATE

我去接近源和启用事务日志的数据库。这些日志的转储显示正在进行的第二个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的。任何想法是什么导致查询执行?

回答

0

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

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