Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check if an element is present in a Django queryset?

Is it like a regular python set?

Suppose I have the following queryset

entry_set = Entry.objects.all()

How do I check if Entry Object e is present in entry_set?

like image 638
Brian Avatar asked Aug 14 '15 04:08

Brian


People also ask

How do you check is exists in Django?

You can use exists() : if scorm. objects. filter(Header__id=qp.id).

What is ID __ in in Django?

In Django, we can use the id__in query with a queryset to filter down a queryset based on a list of IDs. However, by default this will fail if your IDs are UUIDs.


3 Answers

You can use the following code:

if e in Entry.objects.all():         #do something 

Or the best approach:

if Entry.objects.filter(id=e.id).exists():         #do something 
like image 108
Siddharth Gupta Avatar answered Sep 21 '22 04:09

Siddharth Gupta


The best approach, according to Django documentation: https://docs.djangoproject.com/en/2.1/ref/models/querysets/#exists

if Entry.objects.filter(id=item.id).exists():     # Do something 

But you can also do:

if item in Entry.objects.all():     # Do something 

Although this approach is the worser as possible. Because it will loop over the whole Queryset pulling elements from the database one by one, compared to the other approach that is almost everything done in the Database level.

If you have a list of ids or a Queryset others approaches would be use __in

Example with a Queryset:

query_ids = other_queryset.values_list('field_id', flat=True) if Entry.objects.filter(id__in=query_ids).exists():     # Do something 

Or if you have a list of ids:

if Entry.objects.filter(id__in=[1, 2, 3, 4, 5]).exists():     # Do something 

Keep in mind that every time that you do len(queryset), item in queryset or list(queryset) you decrees heavily the performance of Django. I already see cases where by avoiding this practices We improved dozens of seconds in an application.

like image 29
Renato César Avatar answered Sep 23 '22 04:09

Renato César


You can use in operator:

entry_set = Entry.objects.all()
if an_entry in entry_set:
    # The element present.
like image 45
falsetru Avatar answered Sep 23 '22 04:09

falsetru