Django ORM:Select 行按不同的列值

Django ORM: Select rows by distinct column value

这听起来像是一个愚蠢的问题,但我就是想不出如何将这个简单的查询转换成 Django 查询集。

select distinct locality, id from shootsta_bookings.users_useraddress;

我试过这个:

    @list_route(methods=['GET'], url_path='locations')
    def locations(self, request, *args, **kwargs):
        **localities = models.UserAddress.objects.all().values('locality').distinct()**

        data = self.get_serializer(localities, many=True, context={'request': request}).data

        return response.Ok(data)

但它只有 returns 个不同的值 without the ids

如果有帮助,这是我的序列化程序:

class LocationListSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserAddress
        fields = [
            'id',
            'locality',
        ]

我正在寻找一个干净的解决方案,而不必使用 in 子句过滤查询集。

不同的 (id, locality) 元组

您应该将 id 添加到值中,例如:

localities = models.UserAddress.objects.values(<b>'id'</b>, 'locality').distinct()

具有 id

的不同地区

如果您想 return idlocality 使得 localities 不同,我们可以使用子查询,例如:

from django.db.models import Subquery

locs = <b>Subquery(</b>UserAddress.objects.values('locality').distinct()<b>)</b>

localities = models.UserAddress.objects.filter(
    <b>locality__in=locs</b>
).values(<b>'id'</b>, 'locality')

如果您使用 PostgreSQL 数据库,您可以使用 distinct() 来更简单地完成此操作,您可以在其中指定应该不同的列名:

localities = models.UserAddress.objects.values('id', 'locality').distinct(<b>'locality'</b>)