簡體   English   中英

如何在 Django 的 pre_save 信號中寫入正確的條件

[英]How to write proper condition in pre_save signal in Django

我剛剛開始了我的 IT 職業生涯,作為一名 Python/Django 的大三學生。 目前,我正在 Python/Django 后端處理我們商店的庫存/庫存部分。

我想要做的是在將 Order.status 更改為PAID時更改ItemModel中的Item quantity (這是兩個不同的模型 - ItemModel 是各種配置中的項目的Order.status ) - 當客戶端觸發操作時下訂單后(例如銀行確認付款)以及在管理面板中手動設置時。 所以我在 function 上設置信號,如下所示:

@receiver(post_save, sender=Order)
def update_stock(sender, instance, created, **kwargs):
    status_values = [order.status for order in instance.status_history.all()]
    if instance.status == OrderStatus.PAID and instance.status not in status_values:
       stock_to_change = []
       # do something to change the stock quantity in loops
       # Take ItemModel.object -> create StockMove.object
問題就從這里開始:

即使Order是第一次以 PAID 狀態創建的,它的狀態歷史記錄中也會有 PAID 值,因為它是 post_save,所以剛剛創建的狀態已經在那里。 所以我想到的是-好的,將第二個條件更改為instance.status not in status_values[:1] 但它不起作用 - 因為在上述情況下以及在任何其他具有當前 PAID 狀態的訂單中,它將返回一個沒有 PAID 值的列表(這是列表中的最后一個),因此訂單的每次更改(例如新的送貨地址)都會改變庫存數量訂購的產品(它應該只在狀態設置為第一次付款時更新一次PAID != status_values )。

我花了一整天的時間來解決這個問題,但我放棄了。 我應該在 order.model 中覆蓋 save() 方法嗎? 感謝您的任何建議!

我想我已經找到了答案,也許不是一個漂亮的答案,但它可以按我的意願工作。

@receiver(post_save, sender=Order)
def update_stock(sender, instance, created, update_fields, **kwargs):
    status_values = [order.status for order in instance.status_history.all()]

    # Do the rest of the code when Order with status PAID Created=True 
    # or order.status was updated to PAID value 
    # and PAID value is not in OrderStatusHistory.

    if instance.status == OrderStatus.PAID:
        if instance.status not in status_values[:-1]:
            if created or (update_fields is not None and 'status' in update_fields): 
                stock_to_change = []

要工作,它還需要覆蓋 OrderAdmin 中的OrderAdmin save_model()

@admin.register(models.Order)
class OrderAdmin(admin.ModelAdmin):
    
    ...

    def save_model(self, request, obj, form, change):
        update_fields = []

        if change: 
            if form.initial['status'] != form.cleaned_data['status']:
                update_fields.append('status')


        obj.save(update_fields=update_fields)
        return super(OrderAdmin, self).save_model(request, obj, form, change)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM