File tree Expand file tree Collapse file tree 2 files changed +23
-4
lines changed Expand file tree Collapse file tree 2 files changed +23
-4
lines changed Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change @@ -21,8 +21,12 @@ class LazyList(object):
21
21
DJANGO_FILTER_INSTALLED = False
22
22
23
23
24
- def get_reverse_fields (model ):
24
+ def get_reverse_fields (model , local_field_names ):
25
25
for name , attr in model .__dict__ .items ():
26
+ # Don't duplicate any local fields
27
+ if name in local_field_names :
28
+ continue
29
+
26
30
# Django =>1.9 uses 'rel', django <1.9 uses 'related'
27
31
related = getattr (attr , 'rel' , None ) or \
28
32
getattr (attr , 'related' , None )
@@ -44,15 +48,18 @@ def maybe_queryset(value):
44
48
45
49
46
50
def get_model_fields (model ):
47
- reverse_fields = get_reverse_fields (model )
48
- all_fields = [
51
+ local_fields = [
49
52
(field .name , field )
50
53
for field
51
54
in sorted (list (model ._meta .fields ) +
52
55
list (model ._meta .local_many_to_many ))
53
56
]
54
57
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 )
56
63
57
64
return all_fields
58
65
You can’t perform that action at this time.
0 commit comments