2017-02-26 194 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方法來解決此問題。