Я устанавливаю новый ViewSet, используя Django Rest Framework.И я хочу вернуть значения из базы данных, используя Annotate и Sum с Django ORM (или необработанным запросом).
Trade.objects.value('company_id', 'fund_id', 'buy_sell').annotate(quantity=Sum('quantity'))
Как можно получить набор запросов, используя их?
Это простовариант Trade.objects.all ()
Я также пытался использовать необработанный запрос:
Trade.objects.raw("""SELECT `id`, `fund_id`, `company_id`, `buy_sell`, SUM(`quantity`) AS `quantity` FROM `operations_trade` GROUP BY `fund_id`, `company_id`, `buy_sell`""")
Не удалось.
Это мой сериализатор:
class TradeSerializer(serializers.ModelSerializer):
class Meta:
model = Trade
fields = '__all__'
Модель:
class Trade(models.Model):
company = models.ForeignKey('Company', on_delete=models.CASCADE)
is_directional = models.BooleanField(default=True)
fund = models.ForeignKey('Fund', on_delete=models.CASCADE)
broker = models.ForeignKey('Broker', on_delete=models.CASCADE)
currency = models.ForeignKey('Currency', on_delete=models.CASCADE)
buy_sell = models.CharField(max_length=1)
quantity = models.IntegerField()
unity_price = models.FloatField()
commission = models.FloatField()
foreign_exchange = models.FloatField()
date = models.DateField()
settlement = models.DateField()
И мой взгляд:
class TradeViewSet(viewsets.ModelViewSet):
serializer_class = TradeSerializer
queryset = Trade.objects.all()
def get_queryset(self):
queryset = Trade.objects.all()
filtrated = self.request.query_params.get('filtrated', None)
if filtrated is not None:
queryset = Trade.objects.values('company_id', 'fund_id', 'buy_sell').annotate(quantity=Sum('quantity')).order_by('fund_id')
# queryset = Trade.objects.raw("SELECT `id`, `fund_id`, `company_id`, `buy_sell`, SUM(`quantity`) AS `quantity` FROM `operations_trade` GROUP BY `fund_id`, `company_id`, `buy_sell`")
return queryset
Я ожидаю, что вывод набора запросов будет использоваться в качестве dict / объекта для использования на стороне клиента.Когда я не возвращаюсь, а вместо этого печатаю набор запросов, я вижу все значения:
{'company_id': 83, 'fund_id': 1, 'buy_sell': 'B', 'quantity': 11600}
{'company_id': 14, 'fund_id': 1, 'buy_sell': 'B', 'quantity': 205460}
{'company_id': 14, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 205460}
{'company_id': 48, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 51545}
{'company_id': 3, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 149275}
{'company_id': 51, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 12645}
{'company_id': 26, 'fund_id': 1, 'buy_sell': 'B', 'quantity': 68925}
{'company_id': 16, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 10845}
{'company_id': 10, 'fund_id': 1, 'buy_sell': 'B', 'quantity': 186305}
{'company_id': 24, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 21700}
{'company_id': 28, 'fund_id': 1, 'buy_sell': 'B', 'quantity': 273765}
{'company_id': 35, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 19520}
{'company_id': 4, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 235135}
{'company_id': 43, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 33760}
{'company_id': 25, 'fund_id': 1, 'buy_sell': 'S', 'quantity': 16665}
.
.
.
Но при использовании необработанного запроса ничего не возвращается.И используя Django ORM он получил ошибку ниже:
KeyError: "Got KeyError when attempting to get a value for field `unity_price` on serializer `TradeSerializer`.\nThe serializer field might be named incorrectly and not match any attribute or key on the `dict` instance.\nOriginal exception text was: 'unity_price'."