PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Django ORM compara tuplas / ordenação lexicográfica


Abaixo está uma maneira que funciona no Django pré 3.2, usando annotate (que infelizmente também precisa do pequeno truque de configurar um output_field , mesmo que o valor não seja usado).
from django.db.models import F, Func, TextField

col_a_col_b = Func(F('col_a'), F('col_b'), function='ROW', output_type=TextField())
col_a_col_b_from = Func(col_a_value, col_b_value, function='ROW')

filtered_queryset = queryset \
    .annotate(col_a_col_b=col_a_col_b) \
    .filter(col_a_col_b__gt=col_a_col_b_from) \
    .order_by('col_a', 'col_b')

No Django 3.2+ você aparentemente pode usar alias em vez de annotate

Isso funciona porque o que é chamado de tupla é, na verdade, um atalho para um Construtor de linhas , ou seja, (col_a, col_b) é a mesma coisa que ROW(col_a, col_b)

O acima é baseado nas informações este ticket