2017-02-07 5 views
0

у меня есть проблемы в поиске суммы и Avg стоимости акций купили, мой код выглядит следующим образом models.pyДжанго QuerySet сумма и средние значения

class Stock(models.Model): 
    name = models.CharField(verbose_name='Name of Stock', max_length=300) 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    slug = models.SlugField(unique=True) 
    purchase_price = models.DecimalField(verbose_name='Purchase Day Price', blank=True, null=True, max_digits=30, decimal_places=2) 
    pre_price = models.DecimalField(verbose_name='Last Day Price', blank=True, null=True, max_digits=30, decimal_places=2) 
    current_price = models.DecimalField(verbose_name='Current Price', blank=True, null=True, max_digits=30, decimal_places=2) 

class BuyStock(models.Model): 
    user = models.ForeignKey(settings.AUTH_USER_MODEL, default=1) 
    stock = models.ForeignKey(Stock, verbose_name='Search') 
    quantity = models.IntegerField(verbose_name='Quantity Required',default=0) 
    timestamp = models.DateTimeField(auto_now=True, auto_now_add=False) 

views.py

def stock_bought(request): 
    queryset = BuyStock.objects.filter(user=request.user) 
    context = {'queryset': queryset} 
    return render(request, 'stock/stock_bought_list.html', context) 

stock_bought_list.html

{% for item in queryset %} 
     <tr> 
      <td> 
       <a href="{{ item.get_absolute_url }}">{{ item.stock.name }}</a> 
      </td> 
      <td> 
       {{ item.purchase_price }} 
      </td> 
      <td> 
       {{ item.quantity }} 
      </td> 
     </tr> 
    {% endfor %} 

Теперь, если пользователь покупает тот же товар много раз, список также показывает tha t много раз отдельно, но я хочу, чтобы это было как единый элемент (основанный на имени) и сумма количества и средней цены, надеюсь кто-то может мне помочь, спасибо.

+0

Проверить аннотированный метод: https://docs.djangoproject.com/en/1.10/topics/db/aggregation/ – neverwalkaloner

ответ

0

Вам необходимо добавить цену покупки в модель BuyStock.

Тогда, чтобы получить среднюю цену:

queryset = (Stock 
      .objects 
      .filter(user=request.user) 
      .annotate(ave_price=Sum(F('buystock__quantity')*F(buystock__purchase_price'))/Sum(F('buystock__quantity')))) 

Это добавит свойство ave_price каждому экземпляру Stock.

Я не тестировал это, но должен показать вам концепцию.

удалить Также пользователю BuyStock

+0

Владелец создает экземпляры акций, поэтому он принимает решение о покупной цене, поэтому я ввел в Stock модель , Я хотел бы, если покупатель покупает один и тот же склад много раз, он должен показывать как единый товар с общим количеством и средней ценой. Теперь все экземпляры покупки отображаются отдельно. – Biju

0

Исходя из ответа выше, я пришел к следующим выводам.

qs = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(stock_name=Upper('stock__name')).distinct() 
qs1 = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(ave_price=Avg('stock__purchase_price')) 
qs2 = BuyStock.objects.values('stock__name').filter(user=request.user).annotate(total_sum=Sum('quantity')) 

a затем объединенный в шаблоне.

Смежные вопросы