Django ORM: выбор строк по значению столбца - PullRequest
1 голос
/ 18 мая 2019

Это может звучать глупо, но я просто не могу понять, как преобразовать этот простой запрос в набор запросов 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)

Но он возвращает только отдельные значения without the ids.

Вот мой сериализатор, если это поможет:

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

Я ищу чистое решение без необходимости фильтровать набор запросов с помощьюin пункт.

1 Ответ

1 голос
/ 18 мая 2019

Отличительные (идентификатор, местонахождение) кортежи

Вы должны добавить id к значениям, например:

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

Отдельные населенные пункты с идентификатором

Если вы хотите вернуть 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>)
...