PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Django ORM vergleicht Tupel / lexikografische Reihenfolge

Unten ist ein Weg, der in Django vor 3.2 funktioniert, mit annotate (was leider auch den kleinen Hack benötigt, ein output_field zu setzen , obwohl der Wert nicht verwendet wird).

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')

In Django 3.2+ können Sie anscheinend alias verwenden statt annotate

Dies funktioniert, da das, was als Tupel bezeichnet wird, eigentlich eine Abkürzung für ein Zeilenkonstruktor , also (col_a, col_b) ist dasselbe wie ROW(col_a, col_b)

Das Obige basiert auf den Informationen in diesem Ticket