PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Django ORM compare tuples / ordre lexicographique

Vous trouverez ci-dessous une méthode qui fonctionne dans Django avant la version 3.2, en utilisant annotate (qui nécessite aussi malheureusement le léger hack de définir un output_field , même si la valeur n'est pas utilisée).

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

Dans Django 3.2+, vous pouvez apparemment utiliser alias au lieu de annotate

Cela fonctionne puisque ce qu'on appelle un tuple, est en fait un raccourci pour un Constructeur de ligne , soit (col_a, col_b) est la même chose que ROW(col_a, col_b)

Ce qui précède est basé sur les informations contenues dans ce ticket