[英]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.