# DRF serializers 요약
django settings 파일 찾기 순서
django 검색 변수의 순서는 사용자의 settings에서 먼저 찾은 다음 글로벌settings에서 찾습니다. 사용자 desettings 파일에서 찾으면 글로벌 을 계속 찾지 않습니다.settings의 설정 정보입니다.
django 원생의serializer
from django.db import models
# Create your models here.
class Courses(models.Model):
title = models.CharField(max_length=32)
description = models.CharField(max_length=128)
class CoursesView(View):
def get(self, request):
courses = list()
for item in Courses.objects.all():
course = {
"title": item.title,
"description": item.description
}
courses.append(course)
return HttpResponse(json.dumps(courses, ensure_ascii=False))
위의 방식을 통해 우리는 규범에 부합되는 반환 데이터를 정의했고 규범에 부합되는 URL을 추가했다. 우리는 수동으로 REST 개발을 완성했지만 효율이 높지 않았다.
from django.core.serializers import serialize
class StudentView(APIView):
def get(self, request):
origin_Student = Student.objects.all()
serialized_students = serialize("json", origin_students)
return HttpResponse(serialized_students)
사용 방법은 매우 간단합니다. 모듈을 가져온 후 가격에 필요한 형식과queryset은serialize에 전송하여 서열화한 데이터를 되돌려줍니다.
만약 프로젝트가 일부 데이터만 서열화하고 인증, 권한 등 다른 기능을 사용할 필요가 없다면,django원생serializer를 사용할 수 있으며, 그렇지 않으면 DRF를 사용하는 것을 권장합니다.
파서 어셈블리
from django.http import JsonResponse
from rest_framework.view import APIView
from rest_framework.parsers import JSONParser, FormParser
# Create your views here.
class LoginView(APIView):
def get(self, request):
return render(request, 'parserver/logoin.html')
def post(self, request):
# request drf , django request
# request.data property,
# request.data self.parser_classes
print(requet.data) # {'username':'Gavin', 'password':123}
return JsonResponse({'status_code':200, 'code':'ok'})
다음 절차를 따르십시오.
from django.db import models
# create your models here.
class Publich(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_lenght=32)
age = models.IntegerField()
def __str__(self):
return self.name
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
def __str__(self):
return self.name
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
publish = models.ForeignKey(to='Publish', to_field='nid', on_delete=models.CASCADE)
authors = models.ManyToManyField(to='Author')
서열화된 구성 요소를 통해 인터페이스 설계를 하고 먼저 URL을 설계한다.GET와POST를 예로 들면
from django.ruls import re_path
from serializers import views
urlpatterns = [
re_path(r'book/', views.BookView.as_view())
]
새 이름: appserializers.py의 모듈, 모든 서열화 사용을 이 모듈에 집중하여 프로그램의 결합을 해결합니다.
# -*- coding: utf-8 -*-
from rest_framework import serializers
from .models import Book
class BookSerializer(serializers.Serializer):
title = serializers.CharField(max_length=128)
publish_date = serializers.DateTimeField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publish = serializers.CharField(max_length=32)
authors = serializers.CharField(max_length=32)
이어서 정렬화된 구성 요소를 사용하여 시도 클래스를 쓰기 시작합니다
from rest_framework.views import APIView
from rest_framework.response import Response
# app
from .models import Book
#
from .app_serializer import BookSerializer
class BookView(APIView):
def get(self, request):
origin_books = Book.objects.all()
serialized_books = BookSerializer(origin_books, many=True)
return Response(serialized_books.data)
모델 및 URL을 정의한 후 그룹 가격을 시리얼화할 수 있는 단계:
class BookSerializer(serializers.Serializer):
BookTitle = serializers.CharField(max_length=128, source="title")
publishDate = serializers.DateTimeField()
price = serializers.DecimalField(max_digits=5, decimal_places=2)
# source ForeignKey
publish = serializers.CharField(max_length=32, source="publish.name")
authors = serializers.CharField(max_length=32)
그렇게 많은 다중 필드를 어떻게 처리합니까?source 매개 변수를 "authors.all"로 정의하면, 추출된 결과는QuerySet입니다. 이러한 데이터는 전방에 친밀하지 않기 때문에, 우리는 서열화기를 사용하여 끼워넣거나, 이렇게 할 수 있습니다. class BookSerializer(serializers.Serializer):
title = serializers.CharField(max_length=32)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publishDate = serializers.DateField()
publish = serializers.CharField()
publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_email = serializers.CharField(max_length=32, read_only=True, source='publish.email')
# authors = serializers.CharField(max_length=32, source='authors.all')
authors_list = serializers.SerializerMethodField()
def get_authors_list(self, authors_obj):
authors = list()
for author in authors_obj.authors.all():
authors.append(author.name)
return authors
주의, get필드 이름과 일치해야 합니다. 그렇지 않으면 오류가 발생합니다.# -*- coding: utf-8 -*-
from rest_framework.views import APIView
from rest_framework.response import Response
# app
from .models import Book
from .app_serializer import BookSerializer
# Create your views here.
class BookView(APIView):
def get(self, request):
origin_books = Book.objects.all()
serialized_books = BookSerializer(origin_books, many=True)
return Response(serialized_books.data)
def post(self, request):
verified_data = BookSerializer(data=request.data)
if verified_data.is_valid():
book = verified_data.save()
#
authors = Author.objects.filter(nid__in=request.data['authors'])
book.authors.add(*authors)
return Response(verified_data.data)
else:
return Response(verified_data.errors)
POST 인터페이스의 구현 단계: # , , models
class BookSerializer(serializers.Serializer):
# nid = serializers.CharField(max_length=32)
title = serializers.CharField(max_length=128)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
publish = serializers.CharField()
# , __str__
publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
# authors = serializers.CharField(max_length=32) # book_obj.authors.all()
# ,SerializerMethodField()
authors_list = serializers.SerializerMethodField()
def get_authors_list(self, book_obj):
author_list = list()
for author in book_obj.authors.all():
author_list.append(author.name)
return author_list
def create(self, validated_data):
# {'title': 'Python666', 'price': Decimal('66.00'), 'publish': '2'}
validated_data['publish_id'] = validated_data.pop('publish')
book = Book.objects.create(**validated_data)
return book
def update(self, instance, validated_data):
#
instance.title = validated_data.get('title', instance.title)
instance.publishDate = validated_data.get('publishDate', instance.publishDate)
instance.price = validated_data.get('price', instance.price)
instance.publish_id = validated_data.get('publish', instance.publish.nid)
instance.save()
return instance
, ** **? , , ?
~~~python
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('title',
'price',
'publish',
'authors',
'author_list',
'publish_name',
'publish_city'
)
extra_kwargs = {
'publish': {'write_only': True},
'authors': {'write_only': True}
}
publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')
author_list = serializers.SerializerMethodField()
def get_author_list(self, book_obj):
# queryset [{}, {}, {}, {}]
authors = list()
for author in book_obj.authors.all():
authors.append(author.name)
return authors
~~~
##### ModelSerializer Serializer,**ModelSerializer Serializer , :**
- ** model **
- ** , unique_together **
- ** create() updata()**
~~~python
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Book
fields = ('title', 'price',)
# fields = "__all__"
~~~
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.