Skip to content

Commit 06f8323

Browse files
authored
Merge pull request #181 from spockNinja/fix_many_to_many
Fix ManyToMany schema mapping
2 parents afec960 + 9551098 commit 06f8323

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

graphene_django/tests/test_utils.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
from ..utils import get_model_fields
2+
from .models import Film, Reporter
3+
4+
5+
def test_get_model_fields_no_duplication():
6+
reporter_fields = get_model_fields(Reporter)
7+
reporter_name_set = set([field[0] for field in reporter_fields])
8+
assert len(reporter_fields) == len(reporter_name_set)
9+
10+
film_fields = get_model_fields(Film)
11+
film_name_set = set([field[0] for field in film_fields])
12+
assert len(film_fields) == len(film_name_set)

graphene_django/utils.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,12 @@ class LazyList(object):
2121
DJANGO_FILTER_INSTALLED = False
2222

2323

24-
def get_reverse_fields(model):
24+
def get_reverse_fields(model, local_field_names):
2525
for name, attr in model.__dict__.items():
26+
# Don't duplicate any local fields
27+
if name in local_field_names:
28+
continue
29+
2630
# Django =>1.9 uses 'rel', django <1.9 uses 'related'
2731
related = getattr(attr, 'rel', None) or \
2832
getattr(attr, 'related', None)
@@ -44,15 +48,18 @@ def maybe_queryset(value):
4448

4549

4650
def get_model_fields(model):
47-
reverse_fields = get_reverse_fields(model)
48-
all_fields = [
51+
local_fields = [
4952
(field.name, field)
5053
for field
5154
in sorted(list(model._meta.fields) +
5255
list(model._meta.local_many_to_many))
5356
]
5457

55-
all_fields += list(reverse_fields)
58+
# Make sure we don't duplicate local fields with "reverse" version
59+
local_field_names = [field[0] for field in local_fields]
60+
reverse_fields = get_reverse_fields(model, local_field_names)
61+
62+
all_fields = local_fields + list(reverse_fields)
5663

5764
return all_fields
5865

0 commit comments

Comments
 (0)