diff --git a/docs/changelog.rst b/docs/changelog.rst index 19d4db2..c846795 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -9,6 +9,7 @@ Changelog *Release date: TODO* - **IMPROVED:** ``serializers.HiddenField`` are now hidden (:issue:`78`) +- **IMPROVED:** format is now detected for ``SlugRelatedField`` with ``read_only=True`` (:issue:`82`) ********* **1.4.7** diff --git a/src/drf_yasg/inspectors/field.py b/src/drf_yasg/inspectors/field.py index bc34130..4180c30 100644 --- a/src/drf_yasg/inspectors/field.py +++ b/src/drf_yasg/inspectors/field.py @@ -161,7 +161,11 @@ def get_related_model(model, source): :return: related model or ``None`` """ try: - return getattr(model, source).rel.related_model + descriptor = getattr(model, source) + try: + return descriptor.rel.related_model + except Exception: + return descriptor.field.remote_field.model except Exception: # pragma: no cover return None diff --git a/testproj/articles/migrations/0003_auto_20180310_0142.py b/testproj/articles/migrations/0003_auto_20180310_0142.py new file mode 100644 index 0000000..9e608b1 --- /dev/null +++ b/testproj/articles/migrations/0003_auto_20180310_0142.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.11 on 2018-03-10 01:42 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import uuid + + +class Migration(migrations.Migration): + + dependencies = [ + ('articles', '0002_article_article_type'), + ] + + operations = [ + migrations.CreateModel( + name='ArticleGroup', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, unique=True)), + ('title', models.CharField(help_text='title model help_text', max_length=255, unique=True)), + ('slug', models.SlugField(blank=True, help_text='slug model help_text', unique=True)), + ], + ), + migrations.AddField( + model_name='article', + name='group', + field=models.ForeignKey(blank=True, default=None, on_delete=django.db.models.deletion.PROTECT, related_name='articles_as_main', to='articles.ArticleGroup'), + ), + migrations.AddField( + model_name='article', + name='original_group', + field=models.ForeignKey(blank=True, default=None, on_delete=django.db.models.deletion.PROTECT, related_name='articles_as_original', to='articles.ArticleGroup'), + ), + ] diff --git a/testproj/articles/models.py b/testproj/articles/models.py index ca6f453..bf1d4c9 100644 --- a/testproj/articles/models.py +++ b/testproj/articles/models.py @@ -1,3 +1,5 @@ +import uuid + from django.db import models @@ -14,3 +16,14 @@ class Article(models.Model): ) cover = models.ImageField(upload_to='article/original/', blank=True) + group = models.ForeignKey('ArticleGroup', related_name='articles_as_main', blank=True, default=None, + on_delete=models.PROTECT) + original_group = models.ForeignKey('ArticleGroup', related_name='articles_as_original', blank=True, default=None, + on_delete=models.PROTECT) + + +class ArticleGroup(models.Model): + uuid = models.UUIDField(default=uuid.uuid4, editable=False, unique=True) + + title = models.CharField(help_text="title model help_text", max_length=255, blank=False, unique=True) + slug = models.SlugField(help_text="slug model help_text", unique=True, blank=True) diff --git a/testproj/articles/serializers.py b/testproj/articles/serializers.py index c447b71..728c363 100644 --- a/testproj/articles/serializers.py +++ b/testproj/articles/serializers.py @@ -1,7 +1,7 @@ from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers -from articles.models import Article +from articles.models import Article, ArticleGroup class ArticleSerializer(serializers.ModelSerializer): @@ -12,11 +12,13 @@ class ArticleSerializer(serializers.ModelSerializer): ) uuid = serializers.UUIDField(help_text="should articles have UUIDs?", read_only=True) cover_name = serializers.FileField(use_url=False, source='cover', read_only=True) + group = serializers.SlugRelatedField(slug_field='uuid', queryset=ArticleGroup.objects.all()) + original_group = serializers.SlugRelatedField(slug_field='uuid', read_only=True) class Meta: model = Article fields = ('title', 'author', 'body', 'slug', 'date_created', 'date_modified', - 'references', 'uuid', 'cover', 'cover_name', 'article_type') + 'references', 'uuid', 'cover', 'cover_name', 'article_type', 'group', 'original_group', ) read_only_fields = ('date_created', 'date_modified', 'references', 'uuid', 'cover_name') lookup_field = 'slug' diff --git a/tests/reference.yaml b/tests/reference.yaml index 78cf596..6004711 100644 --- a/tests/reference.yaml +++ b/tests/reference.yaml @@ -542,6 +542,7 @@ definitions: required: - title - body + - group type: object properties: title: @@ -601,6 +602,13 @@ definitions: - 3 - 7 - 8 + group: + type: string + format: uuid + original_group: + type: string + format: uuid + readOnly: true Project: required: - projectName