[英]Calculate worth of inventory using python
我正在嘗試使用 Django 和 Python3 創建一個網站,用戶可以在其中將 MTG 卡添加到他們的庫存中。 我有兩個表, inventory_cards
- 12000行-保存用戶的庫存數據和pricing_cards
- 65,000行-保存定價數據每張卡。
inventory_cards
card_id
表包含user_id
、 card_id
、 nonfoil
、 foil
pricing_cards
表包含card_id
、 date
、 nonfoil
、 foil
我正在嘗試計算用戶庫存的總價值,但是我的代碼在數據庫上要么很慢要么很重。
方法一:
該方法需要大約 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.