#28724: QuerySet filter across m2m returns incorrect number of objects
-----------------------------------------+------------------------
               Reporter:  Zach           |          Owner:  nobody
                   Type:  Bug            |         Status:  new
              Component:  Uncategorized  |        Version:  1.11
               Severity:  Normal         |       Keywords:
           Triage Stage:  Unreviewed     |      Has patch:  0
    Needs documentation:  0              |    Needs tests:  0
Patch needs improvement:  0              |  Easy pickings:  0
                  UI/UX:  0              |
-----------------------------------------+------------------------
 {{{#!python
 # models
 from django.db import models

 class ProductArea(models.Model):
   name = models.CharField(max_length=100)

 class Product(models.Model):
   name = models.CharField(max_length=100)
   product_areas = models.ManyToManyField(ProductArea,
 through='Relationship')

 class MembershipLevel(models.Model):
   name = models.CharField(max_length=100)

 class Relationship(models.Model):
   product = models.ForeignKey(Product)
   product_area = models.ForeignKey(ProductArea)
   membership_level = models.ForeignKey(MembershipLevel)
 }}}

 {{{#!python
 from myapp.models import MembershipLevel
 from myapp.models import ProductArea
 from myapp.models import Relationship
 from myapp.models import Product

 p1, _ = Product.objects.get_or_create(name='My Product')
 p2, _ = Product.objects.get_or_create(name='Another Product')
 p3, _ = Product.objects.get_or_create(name='Yet another product')

 a1, _ = ProductArea.objects.get_or_create(name='Air')
 a2, _ = ProductArea.objects.get_or_create(name='Land')
 a3, _ = ProductArea.objects.get_or_create(name='Sea')

 m1, _ = MembershipLevel.objects.get_or_create(name='gold')
 m2, _ = MembershipLevel.objects.get_or_create(name='bronze')
 m3, _ = MembershipLevel.objects.get_or_create(name='silver')

 Relationship.objects.get_or_create(product=p1, product_area=a1,
 membership_level=m1)
 Relationship.objects.get_or_create(product=p1, product_area=a2,
 membership_level=m2)
 Relationship.objects.get_or_create(product=p1, product_area=a3,
 membership_level=m3)
 Relationship.objects.get_or_create(product=p2, product_area=a1,
 membership_level=m1)
 Relationship.objects.get_or_create(product=p2, product_area=a2,
 membership_level=m2)
 Relationship.objects.get_or_create(product=p2, product_area=a3,
 membership_level=m3)
 Relationship.objects.get_or_create(product=p3, product_area=a1,
 membership_level=m1)
 Relationship.objects.get_or_create(product=p3, product_area=a2,
 membership_level=m2)
 Relationship.objects.get_or_create(product=p3, product_area=a3,
 membership_level=m3)

 # "total found: 3".
 print('total found: %s' % Product.objects.count())

 # "total with filter found: 9".
 print('total with filter found: %s' %
 
Product.objects.filter(product_areas__relationship__membership_level__name='gold').count())
 }}}

-- 
Ticket URL: <https://code.djangoproject.com/ticket/28724>
Django <https://code.djangoproject.com/>
The Web framework for perfectionists with deadlines.

-- 
You received this message because you are subscribed to the Google Groups 
"Django updates" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to django-updates+unsubscr...@googlegroups.com.
To post to this group, send email to django-updates@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/052.e493882093f98cefbce4780079afca63%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to