É possível filtrar um queryset Django por propriedade de modelo?
eu tenho um método em meu modelo:
@property
def myproperty(self):
[..]
e agora quero filtrar por esta propriedade como:
MyModel.objects.filter(myproperty=[..])
isso é de alguma forma possível?
Respostas:
Não. Os filtros Django operam no nível do banco de dados, gerando SQL. Para filtrar com base nas propriedades do Python, você precisa carregar o objeto no Python para avaliar a propriedade - e nesse ponto, você já fez todo o trabalho para carregá-lo.
fonte
Posso não ter entendido sua pergunta original, mas há um filtro embutido no python.
Mas é melhor usar uma compreensão de lista :
ou melhor ainda, uma expressão geradora :
fonte
Revelando a solução alternativa sugerida por @ TheGrimmScientist, você pode fazer essas "propriedades sql" definindo-as no gerenciador ou no QuerySet e reutilizando / encadeando / compondo-as:
Com um gerente:
Com um QuerySet:
Veja https://docs.djangoproject.com/en/1.9/topics/db/managers/ para mais. Observe que estou retirando a documentação e não testei os itens acima.
fonte
Parece que usar F () com anotações será minha solução para isso.
Não vai filtrar
@property
, já queF
fala com o banco de dados antes que os objetos sejam trazidos para o python. Mas ainda estou colocando aqui como uma resposta, já que minha razão para querer filtrar por propriedade era realmente querer filtrar objetos pelo resultado de aritmética simples em dois campos diferentes.então, algo como:
em vez de definir a propriedade como:
em seguida, fazer uma lista de compreensão de todos os objetos.
fonte
Eu tive o mesmo problema e desenvolvi esta solução simples:
Eu sei que não é a solução mais performática, mas pode ajudar em casos simples como o meu
fonte
POR FAVOR, alguém me corrija, mas acho que encontrei uma solução, pelo menos para o meu caso.
Eu quero trabalhar em todos aqueles elementos cujas propriedades são exatamente iguais a ... qualquer coisa.
Mas eu tenho vários modelos, e essa rotina deve funcionar para todos os modelos. E faz:
Com esta sub-rotina universal, posso selecionar todos os elementos que são exatamente iguais ao meu dicionário de combinações de 'especificar' (nome da propriedade, valor da propriedade).
O primeiro parâmetro leva um (models.Model),
o segundo, um dicionário como: {"propriedade1": "77", "propriedade2": "12"}
E cria uma instrução SQL como
e retorna um QuerySet sobre esses elementos.
Esta é uma função de teste:
E? O que você acha?
fonte
AttributeError: 'RawQuerySet' object has no attribute 'values'
Eu sei que é uma pergunta antiga, mas para o bem de quem pula aqui, acho que é útil ler a pergunta abaixo e a resposta relativa:
Como personalizar o filtro administrativo no Django 1.4
fonte
Também pode ser possível usar anotações queryset que duplicam a propriedade get / set-logic, como sugerido, por exemplo, por @rattray e @thegrimmscientist , em conjunto com o
property
. Isso poderia produzir algo que funciona tanto no nível Python e no nível de banco de dados.Não tenho certeza sobre as desvantagens, entretanto: veja esta pergunta do SO para um exemplo.
fonte