BOMBOLOM.COM

(django) Relaccionar QuerySets

Por José Lopes

Em algumas situações necessitamos de relaccionar dois QuerySets.

A solução depende se os QuerySets em causa são sobre o mesmo modelo ou não, e aqui neste artigo apresento ambos as soluções.

A informação aqui apresentada foi baseada neste thread.

Se tivermos o mesmo modelo, por exemplo:

query_1 = Model_1.objects.filter(id=1) 
query_2 = Model_1.objects.filter(id=2)

Podemos relaccionar os queries usando | (para união) ou & (para intersecção).

O resultado seria algo como:

query_1 | query_2 = [, ]
query_1 & query_2 = []

Este resultado ainda é uma QuerySet pelo que podemos utilizar todas as opções built-in do Django.

Por outro lado, se estivermos a relaccionar QuerySets de diferentes modelos, como:

query_1 = Model_1.objects.filter(id=1) 
query_2 = Model_2.objects.filter(id=1)

O caso pode ser resolvido utilizando um iterator do the python, o itertools.

Eis como o utilizar:

import itertools
for record in itertools.chain(query_1,query_2):
    do_something(record)

A função do_something pode ser qualquer coisa que necessitemos. Um caso comum é juntar o resultado das duas queries numa lista única, como por exemplo:

import itertools
record_list = []
for record in itertools.chain(query_1,query_2):
    record_list.append(record)

Uma vez feito isto o resultado já não é uma QuerySet mas sim uma Lista, perdendo todos aqueles comandos simpáticos do Django como por exemplo o dictsort nos templates.

Se quisermos então ordenar a lista resultante por um determinado campo de um dos modelos (assumindo que existem dois modelos), por exemplo um campo de nome start_date, teriamos algo como:

record_list.sort(key=lambda x: x.start_date)
06.02.2009 | Ler mais | Comentários | Tags ,

Voltar à Página principal | Made with PyBlosxom