mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-02 20:54:42 +03:00
M2M fields supported
This commit is contained in:
parent
09f2267601
commit
a366d6e612
|
@ -180,6 +180,10 @@ class RelatedField(Field):
|
||||||
Subclass this and override `convert` to define custom behaviour when
|
Subclass this and override `convert` to define custom behaviour when
|
||||||
serializing related objects.
|
serializing related objects.
|
||||||
"""
|
"""
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
self.queryset = kwargs.pop('queryset', None)
|
||||||
|
super(RelatedField, self).__init__(*args, **kwargs)
|
||||||
|
|
||||||
def field_to_native(self, obj, field_name):
|
def field_to_native(self, obj, field_name):
|
||||||
obj = getattr(obj, self.source or field_name)
|
obj = getattr(obj, self.source or field_name)
|
||||||
if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'):
|
if obj.__class__.__name__ in ('RelatedManager', 'ManyRelatedManager'):
|
||||||
|
|
|
@ -246,7 +246,9 @@ class DocumentingHTMLRenderer(BaseRenderer):
|
||||||
serializers.DateField: forms.DateField,
|
serializers.DateField: forms.DateField,
|
||||||
serializers.EmailField: forms.EmailField,
|
serializers.EmailField: forms.EmailField,
|
||||||
serializers.CharField: forms.CharField,
|
serializers.CharField: forms.CharField,
|
||||||
serializers.BooleanField: forms.BooleanField
|
serializers.BooleanField: forms.BooleanField,
|
||||||
|
serializers.PrimaryKeyRelatedField: forms.ChoiceField,
|
||||||
|
serializers.ManyPrimaryKeyRelatedField: forms.ModelMultipleChoiceField
|
||||||
}
|
}
|
||||||
|
|
||||||
# Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python
|
# Creating an on the fly form see: http://stackoverflow.com/questions/3915024/dynamically-creating-classes-python
|
||||||
|
@ -257,10 +259,16 @@ class DocumentingHTMLRenderer(BaseRenderer):
|
||||||
|
|
||||||
serializer = view.get_serializer(instance=obj)
|
serializer = view.get_serializer(instance=obj)
|
||||||
for k, v in serializer.get_fields(True).items():
|
for k, v in serializer.get_fields(True).items():
|
||||||
|
print k, v
|
||||||
if v.readonly:
|
if v.readonly:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
kwargs = {}
|
||||||
|
if getattr(v, 'queryset', None):
|
||||||
|
kwargs['queryset'] = getattr(v, 'queryset', None)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
fields[k] = field_mapping[v.__class__]()
|
fields[k] = field_mapping[v.__class__](**kwargs)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
fields[k] = forms.CharField()
|
fields[k] = forms.CharField()
|
||||||
|
|
||||||
|
|
|
@ -351,9 +351,10 @@ class ModelSerializer(RelatedField, Serializer):
|
||||||
"""
|
"""
|
||||||
Creates a default instance of a flat relational field.
|
Creates a default instance of a flat relational field.
|
||||||
"""
|
"""
|
||||||
|
queryset = model_field.rel.to._default_manager # .using(db).complex_filter(self.rel.limit_choices_to)
|
||||||
if isinstance(model_field, models.fields.related.ManyToManyField):
|
if isinstance(model_field, models.fields.related.ManyToManyField):
|
||||||
return ManyPrimaryKeyRelatedField()
|
return ManyPrimaryKeyRelatedField(queryset=queryset)
|
||||||
return PrimaryKeyRelatedField()
|
return PrimaryKeyRelatedField(queryset=queryset)
|
||||||
|
|
||||||
def get_field(self, model_field):
|
def get_field(self, model_field):
|
||||||
"""
|
"""
|
||||||
|
@ -367,7 +368,7 @@ class ModelSerializer(RelatedField, Serializer):
|
||||||
models.EmailField: EmailField,
|
models.EmailField: EmailField,
|
||||||
models.CharField: CharField,
|
models.CharField: CharField,
|
||||||
models.CommaSeparatedIntegerField: CharField,
|
models.CommaSeparatedIntegerField: CharField,
|
||||||
models.BooleanField: BooleanField
|
models.BooleanField: BooleanField,
|
||||||
}
|
}
|
||||||
try:
|
try:
|
||||||
return field_mapping[model_field.__class__]()
|
return field_mapping[model_field.__class__]()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user