Jonathan Gleason
Jonathan Gleason

Reputation: 4727

Django's Double Underscore

In Django, you can make database queries like the following:

Model.objects.filter(name__icontains = 'bob')

The question is: how is this working 'under the cover'? Is the double underscore a Django thing or a Python thing? Is this just a single variable named name__icontains, or is it some sort of attribute-access syntax? In the former case, how does the filter method parse the variable name to determine that you are searching the Model table for a name that contains somewhere the string bob?

Upvotes: 20

Views: 10519

Answers (1)

icktoofay
icktoofay

Reputation: 129001

It's a Django thing, implemented with some Python things.

In Python, you can get a dictionary of the keyword arguments passed to a function or method:

>>> def func(*args, **kwargs):
...     print(kwargs)
>>> func(a=1, b=2)
{'a': 1, 'b': 2}

From there, it can simply iterate over the dictionary keys and split them on __, and then interpret it however it wants. In this case, it takes the last part and interprets icontains as case-insensitive contains.

Upvotes: 20

Related Questions