[PYTHON] 장고 휴식 프레임 워크는 많은 분야에서 많은 serialize
PYTHON장고 휴식 프레임 워크는 많은 분야에서 많은 serialize
어떻게 many-to-many 필드를 무언가의리스트로 직렬화하고 나머지 프레임 워크를 통해 리턴합니까? 아래의 예에서는 게시물을 태그 목록과 함께 반환하려고합니다.
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
해결법
-
==============================
1.Meta에 model = Tag 클래스의 TagSerializer가 필요합니다. TagSerializer를 만든 후 ManyToManyField 관계에 대해 Many = True로 PostSerializer를 수정합니다.
Meta에 model = Tag 클래스의 TagSerializer가 필요합니다. TagSerializer를 만든 후 ManyToManyField 관계에 대해 Many = True로 PostSerializer를 수정합니다.
class PostSerializer(serializers.ModelSerializer): tag = TagSerializer(read_only=True, many=True) class Meta: ...
DRF 3에 대한 답변입니다.
-
==============================
2.init 메소드의 serializer에서 queryset을 필드에 전달하고 rest_framework는 해당 queryset의 id를 계산할 수 있습니다.
init 메소드의 serializer에서 queryset을 필드에 전달하고 rest_framework는 해당 queryset의 id를 계산할 수 있습니다.
1) 먼저 serializer에서 serializer를 확장합니다. ModelSerializer
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 ()을 사용하면된다.
-
==============================
3.이것이 내가 한 일입니다. 한 권의 책이 한 권 이상의 저자를 가질 수 있고 한 권의 저자가 두 권 이상의 책을 가질 수 있다고 가정 해 봅시다. 모델 :
이것이 내가 한 일입니다. 한 권의 책이 한 권 이상의 저자를 가질 수 있고 한 권의 저자가 두 권 이상의 책을 가질 수 있다고 가정 해 봅시다. 모델 :
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')
-
==============================
4.이것은 나를 위해 작동합니다.
이것은 나를 위해 작동합니다.
tag = TagSerializer(source="tag", read_only=True, many=True)
-
==============================
5.장고 2.0
장고 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',)
from https://stackoverflow.com/questions/33182092/django-rest-framework-serializing-many-to-many-field by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Python range () 및 zip () 객체 유형 (0) | 2018.11.04 |
---|---|
[PYTHON] 루프 및 반복자 동작을위한 Python (0) | 2018.11.04 |
[PYTHON] 와일드 카드를 사용하여 파일 검색 (0) | 2018.11.04 |
[PYTHON] Python은 일치하는 내용으로 다시 대체합니다. (0) | 2018.11.04 |
[PYTHON] ticklabels과 matplotlib의 축 사이에 공백을 어떻게 추가합니까? (0) | 2018.11.04 |