mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-27 16:40:03 +03:00
Exclude intermediate models from reverse fields.
Always dealt reverse relational fields as Many fields.
This commit is contained in:
parent
ad6ca835c0
commit
f3d63deabe
|
@ -371,10 +371,22 @@ class ModelSerializer(Serializer):
|
||||||
_options_class = ModelSerializerOptions
|
_options_class = ModelSerializerOptions
|
||||||
|
|
||||||
def get_reverse_fields(self, opts, fields):
|
def get_reverse_fields(self, opts, fields):
|
||||||
|
# Construct a list of all relations
|
||||||
relations = []
|
relations = []
|
||||||
relations += [obj for obj in opts.get_all_related_objects() if obj.field.serialize]
|
relations += [obj for obj in opts.get_all_related_objects() if obj.field.serialize]
|
||||||
relations += [obj for obj in opts.get_all_related_many_to_many_objects() if obj.field.serialize]
|
relations += [obj for obj in opts.get_all_related_many_to_many_objects() if obj.field.serialize]
|
||||||
return [rel.field for rel in relations]
|
|
||||||
|
# Construct a list of intermediate models
|
||||||
|
exclude = []
|
||||||
|
for field in fields:
|
||||||
|
if field.rel and hasattr(field.rel, 'through'):
|
||||||
|
exclude.append(field.rel.through)
|
||||||
|
# Intermediate models from reverse relations
|
||||||
|
for rel in relations:
|
||||||
|
if rel.field.rel and hasattr(rel.field.rel, 'through'):
|
||||||
|
exclude.append(rel.field.rel.through)
|
||||||
|
|
||||||
|
return [rel.field for rel in relations if rel.model not in exclude]
|
||||||
|
|
||||||
def get_default_fields(self):
|
def get_default_fields(self):
|
||||||
"""
|
"""
|
||||||
|
@ -456,6 +468,9 @@ class ModelSerializer(Serializer):
|
||||||
"""
|
"""
|
||||||
Creates a default instance of a flat relational field.
|
Creates a default instance of a flat relational field.
|
||||||
"""
|
"""
|
||||||
|
# Reverse relational fields must be dealt as Many fields
|
||||||
|
if model_field.model is not self.opts.model:
|
||||||
|
to_many = True
|
||||||
# TODO: filter queryset using:
|
# TODO: filter queryset using:
|
||||||
# .using(db).complex_filter(self.rel.limit_choices_to)
|
# .using(db).complex_filter(self.rel.limit_choices_to)
|
||||||
kwargs = {
|
kwargs = {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user