Python 如何在Django ORM中使用注释和求和返回Queryset?

Python 如何在Django ORM中使用注释和求和返回Queryset?,python,mysql,django,Python,Mysql,Django,我正在使用Django Rest框架设置一个新的视图集。我想使用带有Django ORM(或原始查询)的Annotate和Sum从数据库返回值 如何使用它们返回queryset 这只是Trade.objects.all()的一个变体 我还尝试使用原始查询: Trade.objects.raw("""SELECT `id`, `fund_id`, `company_id`, `buy_sell`, SUM(`quantity`) AS `quantity` FROM `operations_tra

我正在使用Django Rest框架设置一个新的视图集。我想使用带有Django ORM(或原始查询)的Annotate和Sum从数据库返回值

如何使用它们返回queryset

这只是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
我希望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'."
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'."