drf-yasg에서 ForeignKey 필드의 매개 변수에 Serializer를 반영

도전


  • django-rest-framework를 사용하여 웹 API 문서를 drf-yasg에서 생성하려고했는데 모델에서 ForeignKey로 정의 된 매개 변수 정보가 올바르게 표시되지 않았습니다.

    환경


  • python3.6.5
  • djangorestframework==3.9.1
  • drf-yasg==1.13.0

  • 샘플 코드


    from django.db import models
    
    # Create your models here.
    
    
    class Article(models.Model):
        title = models.CharField(max_length=100, blank=True, null=True)
        contents_text = models.TextField(blank=True, null=True)
        pubdate = models.DateTimeField(auto_now_add=True)
    
    
    class User(models.Model):
        name = models.CharField(max_length=100, blank=True, null=True)
    
    
    class Comment(models.Model):
        target_article = models.ForeignKey(Article, on_delete=models.SET_NULL, null=True, related_name='comments')
        comment = models.TextField(blank=True, null=True)
        pubdate = models.DateTimeField(auto_now_add=True)
        user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    
    from rest_framework.serializers import ModelSerializer
    from .models import Article, Comment, User
    
    
    class UserSerializer(ModelSerializer):
        class Meta:
            model = User
            fields = '__all__'
    
    
    class CommentSerializer(ModelSerializer):
        class Meta:
            model = Comment
            fields = [
                'id',
                'target_article',
                'comment',
                'pubdate',
                'user',
            ]
    
    
    class ArticleSerializer(ModelSerializer):
        class Meta:
            model = Article
            fields = [
                'id',
                'title',
                'contents_text',
                'pubdate',
                'comments',
            ]
    
    
  • redoc 출력


  • 해결 방법


  • ArticleSerializercomments 필드를 SerializerMethodField 로 정의하고 get_comments 에서 Article
  • CommentCommentSerializer 필드를 user 로 정의하고 SerializerMethodField 메서드에서 get_user
  • Comment 메소드 및 User 메소드에 get_comments 데코레이터를 추가하고 각 메소드 내에서 사용할 Serializer를 지정합니다.
    from rest_framework.serializers import ModelSerializer, SerializerMethodField
    from .models import Article, Comment, User
    
    from drf_yasg.utils import swagger_serializer_method
    
    
    class UserSerializer(ModelSerializer):
        class Meta:
            model = User
            fields = '__all__'
    
    
    class CommentSerializer(ModelSerializer):
        user = SerializerMethodField()
    
        class Meta:
            model = Comment
            fields = [
                'id',
                'target_article',
                'comment',
                'pubdate',
                'user',
            ]
    
        @swagger_serializer_method(serializer_or_field=UserSerializer)
        def get_user(self, instance):
            return UserSerializer(instance.user).data
    
    
    class ArticleSerializer(ModelSerializer):
        comments = SerializerMethodField()
    
        class Meta:
            model = Article
            fields = [
                'id',
                'title',
                'contents_text',
                'pubdate',
                'comments',
            ]
    
        @swagger_serializer_method(serializer_or_field=CommentSerializer)
        def get_comments(self, instance):
            try:
                return CommentSerializer(instance.comments.get(target_article=instance)).data
            except Exception as e:
                print(e)
                return None
    
  • redoc 출력


  • 보충


    get_user 데코레이터를 붙이지 않으면 @swagger_serializer_method 로 취득하려고 하고 있는 필드는 swagger_serializer_method 형태로서 인식된다


    참고


  • h tps:// 퀵했다. 작은 m/k_마와 82/있어 MS/1727C4355아 94d5b51213
  • htps //w w. d 짱 고레 st-f 라메를 rk. 오 rg/아피구이데/레치온 s/
  • htps : // 기주 b. 코 m/안씨 12/drf-sg/이스에 s/137
  • 좋은 웹페이지 즐겨찾기