这听起来像是一个愚蠢的问题,但我只是不知道如何将这个简单的查询转换为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
子句过滤查询集。
答案 0 :(得分:1)
您应该将id
添加到值中,例如:
localities = models.UserAddress.objects.values('id', 'locality').distinct()
如果您希望将id
与locality
一起返回,以使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')