2013-04-23 2 views
0

У меня проблема с записью группы по sql в приложение django. Может ли кто-нибудь из вас, пользователей django, помочь мне написать этот sql в дружественный django код? Это моя модель:группа в django агрегатная функция?

class Stock(models.Model): 
    name = models.CharField("Stock's name", max_length=200) 
    symbol = models.CharField("Stock's symbol", max_length=20) 

class Dividend(models.Model): 
    amount = models.FloatField(default=0) 
    date = models.DateField('pay date') 
    stock = models.ForeignKey(Stock) 

class UserStock(models.Model): 
    amount = models.FloatField('amount', default=0) 
    date = models.DateField('buy date') 
    price = models.FloatField('price', default=0) 
    user = models.ForeignKey(User) 
    stock = models.ForeignKey(Stock) 

И это SQL код, который я хочу написать в Джанго:

select stock_id, sum(price), sum(amount) as price from stocks_userstock group by stock_id; 

Я пытался написать что-то вроде этого.

my_stock = UserStock.objects.filter(user=request.user)\ 
    .annotate(sum_price = sum('price'), sum_amount = sum('amount')) 

Спасибо заранее, я надеюсь, что это не будет проблемой для некоторых из вас.

ответ

1

Я считаю, просто добавив values вызова будет делать

my_stock = UserStock.objects.get(user=request.user)\ 
    .values('stock_id').annotate(sum_price = sum('price'), sum_amount = sum('amount')) 

и вы получите обратно список dicts подобного

[ 
    {'stock_id': 0, 'sum_price': 10, 'sum_amount': 25}, 
    ... 
] 

см here для получения дополнительной информации

+0

Он по-прежнему дает мне такую ​​же ошибку, как раньше. 'неподдерживаемый тип операндов для +: 'int' и 'str'' в строке' .values ​​("stock_id"). annotate (sum_price = sum (' price '), sum_amount = sum (' amount ')) ' , Эти данные из db должны быть int, почему это строка? – Lucas03

+0

Я не знаю, вы никогда не упоминали об ошибке раньше ... Используете ли вы правильную 'Sum'? (это должен быть капитал, я просто использовал то, что вы разместили) – Ngenator

+0

Да, это была сумма с небольшой первой буквой. Благодарю. – Lucas03

0
stock = Stock.objects.all().annotate(sum_price = Sum('user_stock__price'), sum_amount = Sum('user_stock__amount')) 

Он должен работать.

Я удалил фильтр User в своем фрагменте, чтобы упростить, но вы можете добавить его, конечно.

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