'>' не поддерживается между экземплярами 'dict' и 'dict' в Django 3.0
Я использую Django 3.0 и Python 3.7
вот мой views.py
@login_required
def updated_status(request, pk):
s1 = []
purchase_quantity = Item.objects.filter(order_id=pk)
data = set()
a = [x.id for x in purchase_quantity if x.id not in data and not data.add(x.id)]
stock_quantity = Stock.objects.filter(other_id=pk)
data1 = set()
b = [x.other_item.id for x in stock_quantity if
x.other_item.id not in data1 and not data1.add(x.other_item.id)]
if data == data1:
for j in data1:
stock_quantity = Stock.objects.filter(other_order_id=pk,
other_item_id=j).aggregate(Sum('quantity'))
purchase_quantity = Item.objects.filter(
other_id=pk, id=j).aggregate(Sum('quantity'))
if stock_quantity > purchase_quantity:
Order.objects.filter(id=pk).update(flag=1)
if stock_quantity >= purchase_quantity:
s1.append('true')
else:
s1.append('false')
if 'false' in s1:
Order.objects.filter(id=pk).update(status=3)
else:
Order.objects.filter(id=pk).update(status=2)
else:
pass
return redirect(reverse('get_list_data'))
Как я могу решить эту проблему " TypeError: '>' not supported between instances of 'dict' and 'dict' "
Как stock_quantity, так и purchase_quantity здесь словари: нужно развернуть элемент из словаря, поэтому:
stock_quantity = StockMovements.objects.filter(
other_order_id=pk, other_order_item_id=j
).aggregate(Sum('quantity'))['quantity__sum']
purchase_item_quantity = OtherOrderItem.objects.filter(
other_order_id=pk, id=j
).aggregate(Sum('quantity'))['quantity__sum']
попробуйте это
Django aggregate return dict object.
https://docs.djangoproject.com/en/4.0/topics/db/aggregation/
for j in data1:
stock_quantity = StockMovements.objects.filter(other_order_id=pk, other_order_item_id=j).aggregate(Sum('quantity'))
purchase_item_quantity = OtherOrderItem.objects.filter(other_order_id=pk, id=j).aggregate(Sum('quantity'))
if stock_quantity.get('quantity__sum') > purchase_item_quantity.get('quantity__sum'):
OtherOrder.objects.filter(id=pk).update(flag=1)
if stock_quantity.get('quantity__sum') >= purchase_item_quantity.get('quantity__sum'):
pass
aggregate() - это заключительное предложение для QuerySet, которое при вызове, возвращает словарь пар имя-значение. Имя - это идентификатор для значения агрегата; значение - вычисленный агрегат. Имя автоматически генерируется из имени поля и агрегатной функции. Если вы хотите вручную указать имя для агрегатного значения, вы можете сделать это, указав это имя, когда вы определяете агрегирующее предложение: