Django ORM:按不同的列值选择行

时间:2019-05-18 17:22:36

标签: django django-queryset django-orm

这听起来像是一个愚蠢的问题,但我只是不知道如何将这个简单的查询转换为Django queryset。

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)

但是它只返回不同的值without the ids

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

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

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

1 个答案:

答案 0 :(得分:1)

不同的(id,locality)元组

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

localities = models.UserAddress.objects.values('id', 'locality').distinct()

具有ID的不同地区

如果您希望将idlocality一起返回,以使localities是唯一的,我们可以使用子查询,例如:

from django.db.models import Subquery

locs = Subquery(UserAddress.objects.values('locality').distinct())

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

如果使用 PostgreSQL 数据库,则可以通过使用distinct()来简化此操作,在其中可以指定应该不同的列名:

localities = models.UserAddress.objects.values('id', 'locality').distinct('locality')