#26261: Using GenericRelation with exclude
--------------------------------------+------------------------------------
     Reporter:  Muty                  |      Owner:  nobody
         Type:  Uncategorized         |     Status:  new
    Component:  contrib.contenttypes  |    Version:  1.8
     Severity:  Normal                |   Keywords:  GenericRelation
                                      |  exclude
 Triage Stage:  Unreviewed            |  Has patch:  0
Easy pickings:  0                     |      UI/UX:  0
--------------------------------------+------------------------------------
 Someone (Daniel H) already reported this in the Django users group:
 https://groups.google.com/forum/#!msg/django-
 users/vQcipOhI7N0/4plhTAJ7AAAJ

 What we are experiencing is that when you use GenericForeignKey and
 GenericRelation, you can't use exclude on the QuerySet.

 Here is our setup:

 {{{
 from django.contrib.contenttypes.fields import GenericForeignKey,
 GenericRelation
 from django.contrib.contenttypes.models import ContentType
 from django.db import models


 class Insights(models.Model):
     object_id = models.PositiveIntegerField()
     content_type = models.ForeignKey(ContentType)
     parent_object = GenericForeignKey()
     first_field = models.IntegerField()
     second_field = models.IntegerField()


 class ModelA(models.Model):
     name = models.CharField(max_length=40)

     insights = GenericRelation('Insights', related_query_name='a')


 class ModelB(models.Model):
     title = models.CharField(max_length=40)

     insights = GenericRelation('Insights', related_query_name='b')

 }}}

 and here is how to reproduce this bug:
 {{{
 Python 3.4.3 (v3.4.3:9b73f1c3e601, Feb 23 2015, 02:52:03)
 [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
 Type "help", "copyright", "credits" or "license" for more information.
 (InteractiveConsole)
 >>> from app.models import *
 >>> a = ModelA.objects.create(name='Test')
 >>> a = ModelA.objects.create(name='Test2')
 >>> b = ModelB.objects.create(title='B Test')
 >>> i = Insights.objects.create(parent_object=a, first_field=1,
 second_field=2)
 >>> i = Insights.objects.create(parent_object=a, first_field=1,
 second_field=2)
 >>> i = Insights.objects.create(parent_object=b, first_field=1,
 second_field=2)
 >>> Insights.objects.count()
 3
 >>> i = Insights.objects.filter(a__name='Test2')
 >>> i
 [<Insights: Insights object>]
 >>> i = Insights.objects.filter(a__name='Test2').exclude(a__name='Test')
 Traceback (most recent call last):
   File "<console>", line 1, in <module>
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/query.py", line 797, in exclude
     return self._filter_or_exclude(True, *args, **kwargs)
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/query.py", line 806, in _filter_or_exclude
     clone.query.add_q(~Q(*args, **kwargs))
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/sql/query.py", line 1243, in add_q
     clause, _ = self._add_q(q_object, self.used_aliases)
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/sql/query.py", line 1269, in _add_q
     allow_joins=allow_joins, split_subq=split_subq,
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/sql/query.py", line 1181, in build_filter
     can_reuse, e.names_with_path)
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/sql/query.py", line 1499, in split_exclude
     trimmed_prefix, contains_louter = query.trim_start(names_with_path)
   File "/Users/ahadi/.virtualenvs/django/lib/python3.4/site-
 packages/django/db/models/sql/query.py", line 1934, in trim_start
     join_field = path.join_field.field
 AttributeError: 'GenericRelation' object has no attribute 'field'
 }}}
 We have the problem with Django version 1.8.9, but also reproduced it with
 Django 1.9.2.

 A demo project is attached.

--
Ticket URL: <https://code.djangoproject.com/ticket/26261>
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 [email protected].
To post to this group, send email to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-updates/047.cf3576deeba764cd2179e0b44cefa52d%40djangoproject.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to