首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Group by和Aggregate with nested

Group by和Aggregate with nested
EN

Stack Overflow用户
提问于 2020-12-19 20:06:45
回答 1查看 208关注 0票数 1

我想使用嵌套的序列化程序字段进行分组,并在其他字段上计算一些聚合函数。

我的模型类:

代码语言:javascript
复制
class Country(models.Model):
    code = models.CharField(max_length=5, unique=True)
    name = models.CharField(max_length=50)

class Trade(models.Model):
    country = models.ForeignKey(
        Country, null=True, blank=True, on_delete=models.SET_NULL)
    date = models.DateField(auto_now=False, auto_now_add=False)
    exports = models.DecimalField(max_digits=15, decimal_places=2, default=0)
    imports = models.DecimalField(max_digits=15, decimal_places=2, default=0)

我的序列化程序类:

代码语言:javascript
复制
class CountrySerializers(serializers.ModelSerializer):
    class Meta:
        model = Country
        fields = '__all__'


class TradeAggregateSerializers(serializers.ModelSerializer):
    country = CountrySerializers(read_only=True)
    value = serializers.DecimalField(max_digits=10, decimal_places=2)

    class Meta:
        model = Trade
        fields = ('country','value')

我希望将导入或导出作为查询参数发送,并对其应用聚合(avg) (由不同的国家/地区显示

我的视图类:

代码语言:javascript
复制
class TradeAggragateViewSet(viewsets.ModelViewSet):
    queryset = Trade.objects.all()
    serializer_class = TradeAggregateSerializers

    def get_queryset(self):
        import_or_export = self.request.GET.get('data_type')
        queryset = self.queryset.values('country').annotate(value = models.Avg(import_or_export))
    return queryset

我想以如下格式获取数据:

代码语言:javascript
复制
[
    {
        country:{
            id: ...,
            code: ...,
            name: ...,
        },
        value:...
    },
    ...
]

但是在国家序列化程序上有一个错误

代码语言:javascript
复制
AttributeError: Got AttributeError when attempting to get a value for field `code` on serializer `CountrySerializers`. 
The serializer field might be named incorrectly and not match any attribute or key on the `int` instance. 
Original exception text was: 'int' object has no attribute 'code'.
EN

回答 1

Stack Overflow用户

发布于 2020-12-19 21:26:21

我已经找到了解决方案。实际上,序列化程序类中的to_representation只获得了国家的id,而不是它的对象,所以我将to_representation重写为:

代码语言:javascript
复制
class TradeAggregateSerializers(serializers.ModelSerializer):
...
...
    def to_representation(self, instance):
        #instance['country'] = some id, not object
        #getting actual object
        country =  Country.objects.get(id=instance['country'])
        instance['country'] = country
        data = super(TradeAggregateSerializers, self).to_representation(instance)
        return data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65369649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档