maneira mais limpa para consultar sobre um número dinâmico de colunas em Django?

votos
0

No meu caso, eu tenho um número de nomes de colunas provenientes de um formulário. Eu quero filtrar para se certificar de que eles são tudo verdade. Aqui está como eu atualmente fazê-lo:

for op in self.cleaned_data['options']:
    cars = cars.filter((op, True))

Agora ele trabalha , mas há são um possível ~ 40 colunas a ser testado e, portanto, não parece muito eficiente para manter a consulta.

Existe uma maneira que eu posso condensar isso em uma consulta de filtro?

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


2 respostas

votos
9

Construir a consulta como um dicionário e usar o ** operador para desempacotar as opções como argumentos para o método do filtro.

op_kwargs = {}
for op in self.cleaned_data['options']:
    op_kwargs[op] = True
cars = CarModel.objects.filter(**op_kwargs)

Isso é abordado na documentação do Django e foi coberto no SO também.

Respondeu 09/12/2008 em 18:37
fonte usuário

votos
3

conjuntos de consulta do Django são preguiçosos, então o que você está fazendo atualmente é realmente muito eficiente. O banco de dados não será atingido até que você tentar acessar um dos campos no QuerySet ... assumindo, ou seja, que você não editar algum código, e é efetivamente assim:

cars = CarModel.objects.all()
for op in self.cleaned_data['options']:
    cars = cars.filter((op, True))

Mais informações aqui .

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

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