簡體   English   中英

使用python計算庫存價值

[英]Calculate worth of inventory using python

我正在嘗試使用 Django 和 Python3 創建一個網站,用戶可以在其中將 MTG 卡添加到他們的庫存中。 我有兩個表, inventory_cards - 12000行-保存用戶的庫存數據和pricing_cards - 65,000行-保存定價數據每張卡。

inventory_cards card_id表包含user_idcard_idnonfoilfoil

pricing_cards表包含card_iddatenonfoilfoil

我正在嘗試計算用戶庫存的總價值,但是我的代碼在數據庫上要么很慢要么很重。

方法一:

該方法需要大約 6 分鍾,但只訪問數據庫兩次。 由於網站的這些數據正在顯示,因此頁面加載時間超過 6 分鍾是不可行的。

user_inventory = list(inventory_cards.objects.filter(user_id=request.user.id).values_list('card_id', 'nonfoil', 'foil'))
pricing = list(pricing_cards.objects.order_by('card_id', '-date').distinct('card_id').values_list('card_id', 'nonfoil', 'foil'))

combined_list = [x + y[1:] for x in user_inventory for y in pricing if x[0] == y[0]]
for i in combined_list:
    inventory_value = Decimal(inventory_value) + ((Decimal(i[1]) * Decimal(i[3])) + (Decimal(i[2]) * Decimal(i[4])))

方法二:

該方法需要大約 15 秒,但數據庫顯示超過 25,00 個事務。 這對於頁面加載來說仍然太長,並且可以想象具有多個用戶的數據庫的壓力。

user_inventory = inventory_cards.objects.filter(user_id=request.user.id).values('card_id', 'nonfoil', 'foil')

for i in user_inventory:
    nonfoil_value = i['nonfoil'] * float(pricing_cards.objects.filter(card_id=i['card_id']).values_list('nonfoil').get()[0])
    foil_value = i['foil'] * float(pricing_cards.objects.filter(card_id=i['card_id']).values_list('foil').get()[0])
    inventory_value = inventory_value + (nonfoil_value + foil_value)

有沒有更好的方法來執行這個計算? 有沒有我可以安裝的python包來更好地執行這個計算。

bb1950328我指明了正確的方向。 下面的代碼在不使用 Django 模型的情況下運行 SQL 查詢。 該網頁幾乎立即加載。

with connections['default'].cursor() as cursor:
    cursor.execute("SELECT SUM((inventory_cards.nonfoil * pricing_cards.nonfoil) + (inventory_cards.foil * pricing_cards.foil)) FROM inventory_cards INNER JOIN pricing_cards ON pricing_cards.card_id = inventory_cards.card_id WHERE inventory_cards.user_id = 3")
    inventory_value = cursor.fetchone()[0]

暫無
暫無

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

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