80👍
You can also use the |
operator to create a union:
queryset = MyModel.objects.none()
instance = MyModel.objects.first()
queryset |= MyModel.objects.filter(pk=instance.pk)
But be warned that this will generate different queries depending on the number of items you append this way, making caching of compiled queries inefficient.
32👍
No. A queryset is a representation of a query – hence the name – not an arbitrary collection of instances.
If you really need an actual queryset rather than a list, you could try accumulating the IDs of the objects you need and then getting the objects via an __in
query:
list_of_ids = []
list_of_ids.append(my_id)
...
queryset = MyModel.objects.filter(id__in=list_of_ids)
This isn’t very efficient, though.
- [Django]-Can I access constants in settings.py from templates in Django?
- [Django]-Django no such table:
- [Django]-Change a field in a Django REST Framework ModelSerializer based on the request type?
20👍
This can be done using union
. After doing this, the type of the result can be seen as <class 'django.db.models.query.QuerySet'>
. So two querysets can be combined. Lets see an example.
query1 = User.objects.filter(is_active=True)
query2 = User.objects.filter(is_active=False)
combined_query = query1.union(query2)
print (type(combined_query))
The above program will print result as below, confirming it is a queryset
<class 'django.db.models.query.QuerySet'>
So basically Django executes the below query for union.
(SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."is_active" = True)
UNION
(SELECT "auth_user"."id", "auth_user"."password", "auth_user"."last_login", "auth_user"."is_superuser", "auth_user"."username", "auth_user"."first_name", "auth_user"."last_name", "auth_user"."email", "auth_user"."is_staff", "auth_user"."is_active", "auth_user"."date_joined" FROM "auth_user" WHERE "auth_user"."is_active" = False)
This also means that there will be error(django.db.utils.ProgrammingError: each UNION query must have the same number of columns
) if union is tried with two different tables.
- [Django]-How do I integrate Ajax with Django applications?
- [Django]-Adding new custom permissions in Django
- [Django]-Django data migration when changing a field to ManyToMany
9👍
Queryset is not a list
So
to_list = queryset.values()
To combine queryset
from itertools import chain
result_queryset = list(chain(queryset1, queryset2))
or
querysets = [queryset1, queryset2]
result_queryset = list(chain(*querysets))
- [Django]-How to add url parameters to Django template url tag?
- [Django]-How would you create a 'manual' django migration?
- [Django]-How to require login for Django Generic Views?
0👍
I did now and I got it. Use filter to take multiple ids. Use get only takes a single element. For example, if you have a queryset called Product with many products already registered, that is, with several id’s. Do:
a= list(Product.objects.filter(id=7))
b= list(Product.objects.filter(id__in=['3','5']))
a.append(b)
print(a)
- [Django]-Does SQLAlchemy have an equivalent of Django's get_or_create?
- [Django]-How can I keep test data after Django tests complete?
- [Django]-Creating my own context processor in django