Python 如何在Django ORM中使用注释和求和返回Queryset?
我正在使用Django Rest框架设置一个新的视图集。我想使用带有Django ORM(或原始查询)的Annotate和Sum从数据库返回值 如何使用它们返回queryset 这只是Trade.objects.all()的一个变体 我还尝试使用原始查询: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
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'."