Как вернуть Queryset, используя Annotate и SUM в Django ORM? - PullRequest
1 голос
/ 21 мая 2019

Я устанавливаю новый 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'."
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...