Django dinâmico ou consultas

votos
4

Eu tenho um MultipleChoiceFieldem um carro formulário segurando faz. Eu quero filtrar meu banco de dados de carros para as marcas que foram verificados, mas isso causa um problema. Como faço para obter todas as Q(make=...)declarações em dinamicamente?

Como começo: ['value1', 'value2', ...]

Como eu quero final: Q(col='value1') | Q(col='value2') | ...

Eu tenho par de outros métodos. Eu tentei acrescentar querysets para cada marca e fazê-lo o contrário (fazer várias exclui), mas ambos estavam muito lento.

Publicado 09/12/2008 em 10:03
fonte usuário
Em outras línguas...                            


3 respostas

votos
6

Já experimentou: Model.objects.filter(make__in=list_of_makes)?

O list_of_makes é o que é retornado pela MultipleChoiceField

Consulte a referência de conjunto de consultas sobre o __inoperador.

Respondeu 09/12/2008 em 10:21
fonte usuário

votos
4

Havia um outro método fornecido em #django:

reduce(lambda x,y: x | y, [Q1, Q2, Q3, ...])

O método de Ber é grande para esta instância, mas se você precisa filtrar colunas dinâmicas, mapeamento parece com a próxima maneira mais limpa.

Respondeu 09/12/2008 em 10:52
fonte usuário

votos
3

Tentei resposta de Oli, mas não funcionou, mesmo com a reduzir () uma vez que parece objetos Q não aceitam dicionários como argumento:

Aqui está como eu tinha que trabalhar:

# These are the fields I want to search with an OR clause
search_fields = ['title__icontains', 'publisher__name__icontains', 'authors__name__icontains']

search = 'search string'
clauses = []
for item in search_fields:
    clauses.append(queryset.filter(**{item: search}))
    queryset  = reduce(lambda x, y: x | y, clauses).distinct()

Verifique se há problemas de desempenho desde que eu só foi capaz de testar com um pequeno conjunto de dados.

Respondeu 16/11/2010 em 00:19
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more