Infer ChoiceField type from model field when in ModelSerializer
Fixes part of issue #69openapi3 1.4.4
parent
3f7ad62950
commit
ee46f59fb1
|
|
@ -13,9 +13,9 @@
|
||||||
</component>
|
</component>
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$MODULE_DIR$">
|
<content url="file://$MODULE_DIR$">
|
||||||
<sourceFolder url="file://$MODULE_DIR$" isTestSource="false" />
|
|
||||||
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
<sourceFolder url="file://$MODULE_DIR$/testproj" isTestSource="false" />
|
<sourceFolder url="file://$MODULE_DIR$/testproj" isTestSource="false" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/venv" />
|
||||||
</content>
|
</content>
|
||||||
<orderEntry type="jdk" jdkName="Python 3.6 (drf-yasg)" jdkType="Python SDK" />
|
<orderEntry type="jdk" jdkName="Python 3.6 (drf-yasg)" jdkType="Python SDK" />
|
||||||
<orderEntry type="sourceFolder" forTests="false" />
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
|
@ -24,7 +24,7 @@
|
||||||
<option name="TEMPLATE_CONFIGURATION" value="Django" />
|
<option name="TEMPLATE_CONFIGURATION" value="Django" />
|
||||||
<option name="TEMPLATE_FOLDERS">
|
<option name="TEMPLATE_FOLDERS">
|
||||||
<list>
|
<list>
|
||||||
<option value="$MODULE_DIR$/drf_yasg/templates" />
|
<option value="$MODULE_DIR$/src/drf_yasg/templates" />
|
||||||
</list>
|
</list>
|
||||||
</option>
|
</option>
|
||||||
</component>
|
</component>
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,17 @@ Changelog
|
||||||
#########
|
#########
|
||||||
|
|
||||||
|
|
||||||
|
*********
|
||||||
|
**1.4.4**
|
||||||
|
*********
|
||||||
|
|
||||||
|
*Release date: Feb 26, 2018*
|
||||||
|
|
||||||
|
- **IMPROVED:** ``type`` for ``ChoiceField`` generated by a ``ModelSerializer`` from a model field with ``choices=...``
|
||||||
|
will now be set according to the associated model field (:issue:`69`)
|
||||||
|
- **FIXED:** ``lookup_field`` and ``lookup_value_regex`` on the same ``ViewSet`` will no longer trigger an exception
|
||||||
|
(:issue:`68`)
|
||||||
|
|
||||||
*********
|
*********
|
||||||
**1.4.3**
|
**1.4.3**
|
||||||
*********
|
*********
|
||||||
|
|
|
||||||
|
|
@ -397,16 +397,27 @@ class ChoiceFieldInspector(FieldInspector):
|
||||||
def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):
|
def field_to_swagger_object(self, field, swagger_object_type, use_references, **kwargs):
|
||||||
SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs)
|
SwaggerType, ChildSwaggerType = self._get_partial_types(field, swagger_object_type, use_references, **kwargs)
|
||||||
|
|
||||||
if isinstance(field, serializers.MultipleChoiceField):
|
if isinstance(field, serializers.ChoiceField):
|
||||||
return SwaggerType(
|
enum_type = openapi.TYPE_STRING
|
||||||
type=openapi.TYPE_ARRAY,
|
|
||||||
items=ChildSwaggerType(
|
# for ModelSerializer, try to infer the type from the associated model field
|
||||||
type=openapi.TYPE_STRING,
|
serializer = get_parent_serializer(field)
|
||||||
enum=list(field.choices.keys())
|
if isinstance(serializer, serializers.ModelSerializer):
|
||||||
|
model = getattr(getattr(serializer, 'Meta'), 'model')
|
||||||
|
model_field = get_model_field(model, field.source)
|
||||||
|
if model_field:
|
||||||
|
enum_type = get_basic_type_info(model_field).get('type', enum_type)
|
||||||
|
|
||||||
|
if isinstance(field, serializers.MultipleChoiceField):
|
||||||
|
return SwaggerType(
|
||||||
|
type=openapi.TYPE_ARRAY,
|
||||||
|
items=ChildSwaggerType(
|
||||||
|
type=enum_type,
|
||||||
|
enum=list(field.choices.keys())
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
elif isinstance(field, serializers.ChoiceField):
|
return SwaggerType(type=enum_type, enum=list(field.choices.keys()))
|
||||||
return SwaggerType(type=openapi.TYPE_STRING, enum=list(field.choices.keys()))
|
|
||||||
|
|
||||||
return NotHandled
|
return NotHandled
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 2.0.1 on 2018-02-26 18:32
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('articles', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='article',
|
||||||
|
name='article_type',
|
||||||
|
field=models.PositiveSmallIntegerField(choices=[(1, 'first'), (2, 'second'), (3, 'third'), (7, 'seven'), (8, 'eight')], help_text='IntegerField declared on model with choices=(...) and exposed via ModelSerializer', null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -8,5 +8,9 @@ class Article(models.Model):
|
||||||
date_created = models.DateTimeField(auto_now_add=True)
|
date_created = models.DateTimeField(auto_now_add=True)
|
||||||
date_modified = models.DateTimeField(auto_now=True)
|
date_modified = models.DateTimeField(auto_now=True)
|
||||||
author = models.ForeignKey('auth.User', related_name='articles', on_delete=models.CASCADE)
|
author = models.ForeignKey('auth.User', related_name='articles', on_delete=models.CASCADE)
|
||||||
|
article_type = models.PositiveSmallIntegerField(
|
||||||
|
help_text="IntegerField declared on model with choices=(...) and exposed via ModelSerializer",
|
||||||
|
choices=((1, "first"), (2, "second"), (3, "third"), (7, "seven"), (8, "eight")), null=True
|
||||||
|
)
|
||||||
|
|
||||||
cover = models.ImageField(upload_to='article/original/', blank=True)
|
cover = models.ImageField(upload_to='article/original/', blank=True)
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class ArticleSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Article
|
model = Article
|
||||||
fields = ('title', 'author', 'body', 'slug', 'date_created', 'date_modified',
|
fields = ('title', 'author', 'body', 'slug', 'date_created', 'date_modified',
|
||||||
'references', 'uuid', 'cover', 'cover_name')
|
'references', 'uuid', 'cover', 'cover_name', 'article_type')
|
||||||
read_only_fields = ('date_created', 'date_modified',
|
read_only_fields = ('date_created', 'date_modified',
|
||||||
'references', 'uuid', 'cover_name')
|
'references', 'uuid', 'cover_name')
|
||||||
lookup_field = 'slug'
|
lookup_field = 'slug'
|
||||||
|
|
|
||||||
|
|
@ -591,6 +591,16 @@ definitions:
|
||||||
cover_name:
|
cover_name:
|
||||||
type: string
|
type: string
|
||||||
readOnly: true
|
readOnly: true
|
||||||
|
article_type:
|
||||||
|
description: IntegerField declared on model with choices=(...) and exposed
|
||||||
|
via ModelSerializer
|
||||||
|
type: integer
|
||||||
|
enum:
|
||||||
|
- 1
|
||||||
|
- 2
|
||||||
|
- 3
|
||||||
|
- 7
|
||||||
|
- 8
|
||||||
Project:
|
Project:
|
||||||
required:
|
required:
|
||||||
- projectName
|
- projectName
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue