4

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 ?

1 Answer 1

5

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 to B (or C) is typically named b (or c), not a (or b), 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.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.