Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

possível filtrar o queryset após a consulta? django


Sim, você pode reutilizar conjuntos de consultas existentes.
everyone = User.objects.filter(is_active=True)
active_not_deleted = everyone.filter(is_deleted=False)
active_is_deleted = everyone.filter(is_deleted=True)

Isso não está realmente tornando nada mais rápido, na verdade, esse bloco de código nem mesmo executará uma consulta no banco de dados porque os Django QuerySets são avaliados preguiçosamente. O que quero dizer é que ele não enviará a consulta ao banco de dados até que você realmente precise dos valores. Aqui está um exemplo que falará com o banco de dados.
everyone = User.objects.filter(is_active=True)  # Building SQL...
active_not_deleted = everyone.filter(is_deleted=False)  # Building SQL...
active_is_deleted = everyone.filter(is_deleted=True)  # Building SQL...

# Example of the whole queryset being evaluated
for user in everyone:
    # This will execute the query against the database to return the list of users
    # i.e. "select * from user where is_active is True;"
    print(user)

# Example of using iterator to evaluate one object at a time from the queryset.
for user in active_not_deleted.iterator():
    # This will execute the query for each result, so it doesn't
    # load everything at once and it doesn't cache the results.
    # "select * from user where is_active is True and is_deleted is False limit 1 offset 0;"
    # The offset is incremented on each loop and another query is sent to retrieve the next user in the list.
    print(user)

Recomendo a leitura:

Como complemento a esta resposta, você pode fazer uma única consulta e filtrar em Python, se realmente quiser. Lembre-se, você não pode fazer a filtragem subsequente nas listas porque elas não são QuerySets.
everyone = User.objects.filter(is_active=True)
active_not_deleted = list(filter(lambda user: user.is_deleted is False), list(everyone))
active_is_deleted = list(filter(lambda user: user.is_deleted is True), list(everyone))

Neste último exemplo, everyone é um conjunto de consultas e active_not_deleted e active_is_deleted são listas Python de objetos User. O everyone queryset só será avaliado uma vez na primeira list(everyone) chamada e, em seguida, os resultados são armazenados em cache.