다 대다 필드를 직렬화하는 Django 나머지 프레임 워크
다 대다 필드를 무언가 목록으로 직렬화하고 나머지 프레임 워크를 통해 반환하는 방법은 무엇입니까? 아래 예제에서는 관련된 태그 목록과 함께 게시물을 반환하려고합니다.
models.py
class post(models.Model):
tag = models.ManyToManyField(Tag)
text = models.CharField(max_length=100)
serializers.py
class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = ("text", "tag"??)
views.py
class PostViewSet(viewsets.ReadOnlyModelViewSet):
queryset = Post.objects.all()
serializer_class = PostSerializer
당신은 필요합니다 TagSerializer
, 그 class Meta
있습니다 model = Tag
. TagSerializer
가 생성 된 후 관계에 대해 PostSerializer
with many=True
를 수정합니다 ManyToManyField
.
class PostSerializer(serializers.ModelSerializer):
tag = TagSerializer(read_only=True, many=True)
class Meta:
...
이것이 제가 한 일입니다. 한 책이 한 명 이상의 저자를 가질 수 있고 한 명의 저자가 한 권 이상의 책을 가질 수 있다고 가정 해 보겠습니다. 모델 :
class Author(models.Model):
name = models.CharField(max_length=100, default="")
last_name = models.IntegerField(default=0)
class Book(models.Model):
authors = models.ManyToManyField(Author, related_name="book_list", blank=True)
name = models.CharField(max_length=100, default="")
published = models.BooleanField(default=True)
직렬 변환기에서 :
class BookSerializer(serializers.ModelSerializer):
authors = serializers.PrimaryKeyRelatedField(queryset=Author.objects.all(), many=True)
class Meta:
model = Book
fields = ('id', 'name', 'published', 'authors')
class AuthorSerializer(serializers.ModelSerializer):
book_list = BookSerializer(many=True, read_only=True)
class Meta:
model = Author
fields = ('id', 'name', 'last_name', 'book_list')
init 메서드 의 serializer에서 쿼리 세트를 필드에 전달할 수 있으며 rest_framework는 해당 쿼리 세트의 ID를 검증합니다.
1) 먼저 serializer에서 serializer를 확장하십시오.
class YourSerializer(serializers.ModelSerializer):
2) 메타 클래스에 필드 포함
class YourSerializer(serializers.ModelSerializer):
class Meta:
fields = (..., 'your_field',)
3) init 메소드에서 :
def __init__(self, *args, **kwargs):
super(YourSerializer, self).__init__(*args, **kwargs)
self.fields['your_field].queryset = <the queryset of your field>
필터를 사용하여 모든 인수 아래에서 해당 필드에 대한 쿼리 세트를 제한하거나 평소처럼 제외 할 수 있습니다. 모두 포함하려면 .objects.all () 사용하십시오.
장고 2.0
다 대다 필드의 경우 특정 필드를 원하는 경우 :
class QuestionSerializer(serializers.ModelSerializer):
topics_list = serializers.SerializerMethodField()
def get_topics_list(self, instance):
names = []
a = instance.topics.get_queryset()
for i in a:
names.append(i.desc)
return names
class Meta:
model = Question
fields = ('topics_list',)
이것은 나를 위해 작동합니다.
tag = TagSerializer(source="tag", read_only=True, many=True)
@Brian의 답변 "태그"에 추가 : [{ "name": "tag1"}]는 다음과 같이 "태그": [ "tag1", "tag2", ...]로 단순화 할 수 있습니다.
class PostSerializer(serializers.ModelSerializer):
tag = TagSerializer(read_only=True, many=True)
class Meta:
...
class TagSerializer(serializers.RelatedField):
def to_representation(self, value):
return value.name
class Meta:
model = Tag
자세한 정보 : https://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields
참조 URL : https://stackoverflow.com/questions/33182092/django-rest-framework-serializing-many-to-many-field
'development' 카테고리의 다른 글
Java 8 Lambda를 사용하여 스트림에서 다양한 항목을 얻는 방법은 무엇입니까? (0) | 2020.12.30 |
---|---|
Git 오류 : 이전 rebase 디렉토리 .git / rebase-apply가 여전히 존재하지만 mbox가 제공됨 (0) | 2020.12.30 |
파이썬에서 __weakref__는 정확히 무엇입니까? (0) | 2020.12.30 |
Perl에서 stderr, stdout 및 종료 코드를 한꺼번에 캡처하는 방법은 무엇입니까? (0) | 2020.12.30 |
java.exe -jar로 내 jar를 실행하는 동안 NoClassDefFoundError가 발생했습니다… 무엇이 잘못 되었나요? (0) | 2020.12.29 |