I keep it simple. I have 3 models.
class C(models.model):
some_field = models.BooleanField(default=False)
class B(models.model):
b = models.ForeignKey(C)
class A(models.model):
a = models.ForeignKey(B)
I need a query filter that gets A.a.b.some_field = True. how can I achieve this ?
You can filter your A objects that satisfy this condition with:
A.objects.filter(a__b__some_field=True)
This will generate a query that looks, more or less like:
SELECT a.*
FROM a
JOIN b ON a.a_id = b.id
JOIN c ON b.b_id = c.id
WHERE c.some_field = 1
The double underscore (__) can be used to look "through" relations (like ForeignKeys, OneToOneFields and ManyToManyFields). In case it is ...-to-many field, this is existentially quantified. But here the ForeignKeys are many-to-one relations, so that does not matter.
Note:
ForeignKeys toB(orC) is typically namedb(orc), nota(orb), since that is the name of the current model. The name of a relation typically specifies how the object(s) it targets relate to the current model.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With