drf-yasg에서 ForeignKey 필드의 매개 변수에 Serializer를 반영
13836 단어 django-rest-framework파이썬장고비망록
도전
ForeignKey
로 정의 된 매개 변수 정보가 올바르게 표시되지 않았습니다.환경
샘플 코드
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',
]
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',
]
해결 방법
ArticleSerializer
의 comments
필드를 SerializerMethodField
로 정의하고 get_comments
에서 Article
Comment
의 CommentSerializer
필드를 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
보충
get_user
데코레이터를 붙이지 않으면 @swagger_serializer_method
로 취득하려고 하고 있는 필드는 swagger_serializer_method
형태로서 인식된다
참고
Reference
이 문제에 관하여(drf-yasg에서 ForeignKey 필드의 매개 변수에 Serializer를 반영), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/kiri__n/items/f415bbc0187fffc7d202텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)