如何使用django对模型进行分组和注解

qyswt5oh  于 2023-07-01  发布在  Go
关注(0)|答案(1)|浏览(104)

我有这个:

class City(models.Model):
      postal_code = models.IntegerField()

class CountryViewset(GenericViewSet, ListModelMixin, RetrieveModelMixin):
    queryset = City.objects.values("country_code").annotate(cities_ids=ArrayAgg("id"))
    serializer_class = CountrySerializer

class CountrySerializer(serializers.Serializer):
    country_code = serializers.IntegerField()
    cities_ids = serializers.ListField(child=serializers.IntegerField())

我得到了:

{
    country_code: 1,
    cities_ids: [1, 2, 3],
}

是否可以直接对对象进行注解?我希望我的国家/地区查询集看起来像这样:

<Queryset [
  {
    country_code: 1,
    cities_ids: <QuerySet [<City: 1>, <City: 2>, <City: 3>]>,
  },
  ...
]>

因为将来我会添加很多django过滤器,我不想每次为了性能而操作时都获取/过滤City对象。
我无法创建国家/地区模型,因为不允许我使用管理命令定期同步国家/地区模型。

smdncfj3

smdncfj31#

因为将来我会添加很多django过滤器,我不想每次为了性能而操作时都获取/过滤City对象。
我并没有真正理解这对过滤City对象的影响。您的查询集将City作为“根模型”。您可以用途:

class CountryViewset(GenericViewSet, ListModelMixin, RetrieveModelMixin):
    queryset = City.objects.all()
    serializer_class = CountrySerializer

    def filter_queryset(self, *args, **kwargs):
        return (
            super()
            .filter_queryset(*args, **kwargs)
            .values('country_code')
            .annotate(cities_ids=ArrayAgg('id'))
        )

这意味着它将首先通过Django的过滤后端,然后您对查询集进行注解和后处理。因此,如果您稍后插入FilterSet,它将使用该过滤器集。
话虽如此,我认为建模可能是问题所在。您通常应该有一个Country模型,可能使用code作为主键,并使用Foreignkey s。

相关问题