Merge pull request #290 from DouglasConnect/fix-distinct-bug

Fix distinct bug
This commit is contained in:
Syrus Akbary 2018-06-05 12:57:19 -07:00 committed by GitHub
commit 7563045d75
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 70 additions and 4 deletions

View File

@ -67,6 +67,10 @@ class DjangoConnectionField(ConnectionField):
@classmethod
def merge_querysets(cls, default_queryset, queryset):
if default_queryset.query.distinct and not queryset.query.distinct:
queryset = queryset.distinct()
elif queryset.query.distinct and not default_queryset.query.distinct:
default_queryset = default_queryset.distinct()
return queryset & default_queryset
@classmethod

View File

@ -19,6 +19,10 @@ class FilmDetails(models.Model):
class Film(models.Model):
genre = models.CharField(max_length=2, help_text='Genre', choices=[
('do', 'Documentary'),
('ot', 'Other')
], default='ot')
reporters = models.ManyToManyField('Reporter',
related_name='films')

View File

@ -5,6 +5,8 @@ from django.db import models
from django.utils.functional import SimpleLazyObject
from py.test import raises
from django.db.models import Q
import graphene
from graphene.relay import Node
@ -17,6 +19,8 @@ from .models import (
Article,
CNNReporter,
Reporter,
Film,
FilmDetails,
)
pytestmark = pytest.mark.django_db
@ -431,6 +435,60 @@ def test_should_query_node_filtering():
assert result.data == expected
@pytest.mark.skipif(not DJANGO_FILTER_INSTALLED,
reason="django-filter should be installed")
def test_should_query_node_filtering_with_distinct_queryset():
class FilmType(DjangoObjectType):
class Meta:
model = Film
interfaces = (Node, )
filter_fields = ('genre',)
class Query(graphene.ObjectType):
films = DjangoConnectionField(FilmType)
# def resolve_all_reporters_with_berlin_films(self, args, context, info):
# return Reporter.objects.filter(Q(films__film__location__contains="Berlin") | Q(a_choice=1))
def resolve_films(self, info, **args):
return Film.objects.filter(Q(details__location__contains="Berlin") | Q(genre__in=['ot'])).distinct()
f = Film.objects.create(
)
fd = FilmDetails.objects.create(
location="Berlin",
film=f
)
schema = graphene.Schema(query=Query)
query = '''
query NodeFilteringQuery {
films {
edges {
node {
genre
}
}
}
}
'''
expected = {
'films': {
'edges': [{
'node': {
'genre': 'OT'
}
}]
}
}
result = schema.execute(query)
assert not result.errors
assert result.data == expected
@pytest.mark.skipif(not DJANGO_FILTER_INSTALLED,
reason="django-filter should be installed")
def test_should_query_node_multiple_filtering():