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 id
和 locality
使得 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>)
这听起来像是一个愚蠢的问题,但我就是想不出如何将这个简单的查询转换成 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 id
和 locality
使得 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>)