Let's say we have baskets of fruits. How to filter out those baskets that contains all fruits in a given basket?
In this document https://docs.djangoproject.com/en/dev/ref/models/querysets/#in 'in' method seems will return any basket which contains any of the given fruit. Is there any "set_contains" method to be used for filtering ? Such as Basket.objects.filter(fruit_set_containsAll=fruitSet) ?
Edit: I found that Q() is not working as expected. I'll post the test here:
class Basket(models.Model):
weight = models.FloatField(default=1)
class Fruitname(models.Model):
name = models.CharField(max_length=32)
class Fruit(models.Model):
ofkind = models.ForeignKey(Fruitname, on_delete=models.CASCADE)
inbasket = models.ForeignKey(Basket, on_delete=models.CASCADE)
weight = models.FloatField(default=1)
the database is set as 'apple' only in 1 basket, 'pear' in 2 baskets, and 'banana' in 3 basket:
print Basket.objects.all()
print Fruitname.objects.all()
[<Basket: id 31 has 4 fruits
1. id - 53 apple(28), weight 1.00
2. id - 54 apple(28), weight 2.00
3. id - 55 apple(28), weight 3.00
4. id - 62 banana(30), weight 10.00
>, <Basket: id 32 has 2 fruits
1. id - 56 pear(29), weight 4.00
2. id - 57 banana(30), weight 5.00
>, <Basket: id 33 has 4 fruits
1. id - 58 pear(29), weight 6.00
2. id - 59 banana(30), weight 7.00
3. id - 60 pear(29), weight 8.00
4. id - 61 pear(29), weight 9.00
>]
[<Fruitname: apple(28)>, <Fruitname: pear(29)>, <Fruitname: banana(30)>]
If I try to query with 'apple' and 'banana', it gives empty set !!
print Basket.objects.filter(Q(fruit__ofkind__name__in=['apple'])&Q(fruit__ofkind__name__in=['banana'])).distinct()
[]
similarly,
print Basket.objects.filter(Q(fruit__ofkind__name__in=['banana'])&Q(fruit__ofkind__name__in=['pear'])).distinct()
[]
Here's how I use 'in' to filter, it is not what I need which is supposed to be an empty set.
print Basket.objects.filter(Q(fruit__ofkind__name__in=['apple','pear'])).distinct()
[<Basket: id 31 has 4 fruits
1. id - 53 apple(28), weight 1.00
2. id - 54 apple(28), weight 2.00
3. id - 55 apple(28), weight 3.00
4. id - 62 banana(30), weight 10.00
>, <Basket: id 32 has 2 fruits
1. id - 56 pear(29), weight 4.00
2. id - 57 banana(30), weight 5.00
>, <Basket: id 33 has 4 fruits
1. id - 58 pear(29), weight 6.00
2. id - 59 banana(30), weight 7.00
3. id - 60 pear(29), weight 8.00
4. id - 61 pear(29), weight 9.00
>]
The only way that is working properly is chaining with filter:
Basket.objects.filter(fruit__ofkind__name__in=['apple']).filter(fruit__ofkind__name__in=['banana']).distinct()
[<Basket: id 31 has 4 fruits
1. id - 53 apple(28), weight 1.00
2. id - 54 apple(28), weight 2.00
3. id - 55 apple(28), weight 3.00
4. id - 62 banana(30), weight 10.00
>]
These code is tested with Django 1.9.4 Any explaining? I would undo the accepted answer for the moment.