21:django 객체 시리얼화
16867 단어 django
django의 서열화 클래스는django에 있습니다.core 아래의 Serializers 폴더 안,base.py 파일에는 서열기와 반서열기의 기본 클래스와 일부 이상이 정의되어 있습니다.init__.py 파일은 형식에 따라 대응하는 서열기를 선택하는 방법을 정의했습니다. 같이 봅시다.
__init__.py와base.py 파일의 함수 원형은 다음과 같다.
def serialize(format, queryset, **options):
"""Serialize a queryset (or any iterator that returns database objects) using
a certain serializer."""
s = get_serializer(format)()
s.serialize(queryset, **options)
return s.getvalue()
def deserialize(format, stream_or_string, **options):
""" Deserialize a stream or a string. Returns an iterator that yields ``(obj,
m2m_relation_dict)``, where ``obj`` is a instantiated -- but *unsaved* --
object, and ``m2m_relation_dict`` is a dictionary of ``{m2m_field_name :
list_of_related_objects}``. """
d = get_deserializer(format)
return d(stream_or_string, **options)
class Serializer(object):
""" Abstract serializer base class. """
# Indicates if the implemented serializer is only available for
# internal Django use.
internal_use_only = False
def serialize(self, queryset, **options):
class Deserializer(object):
""" Abstract base deserializer class. """
def __init__(self, stream_or_string, **options):
그럼 이제 본격적으로django의 서열화 조작을 설명해 보도록 하겠습니다.
시리얼화된 데이터
최상위api에서 서열화 데이터는 매우 쉬운 조작이다. 위의 함수를 보면 알 수 있듯이serialize 함수는 하나의 형식과queryset을 받아들여 서열화된 데이터를 되돌려준다.
간단한 쓰기:
from django.core import serializers
data = serializers.serialize("xml", SomeModel.objects.all())
복잡한 쓰기 방법:
XMLSerializer = serializers.get_serializer("xml")
xml_serializer = XMLSerializer()
xml_serializer.serialize(queryset)
data = xml_serializer.getvalue()
해열화 데이터
하나의 형식과 하나의 데이터 흐름을 받아들이고 교체기를 되돌려줍니다.
for obj in serializers.deserialize("xml", data):
do_something_with(obj)
그러나 deserialize가 되돌아오는 것은 간단한django 형식의 대상이 아니라 DeserializedObject의 실례입니다. 이 실례들은 저장되지 않았습니다. DeserializedObject를 사용하십시오.save () 방법은 이 데이터를 데이터베이스에 저장합니다
시리얼화된 형식
django는 많은 서열화 형식이 있습니다. 제3자가 지원하는 모듈을 설치해야 합니다. xml, json,yaml은 기본적으로 지원합니다.
주의 사항
만약utf-8 또는 다른 비ascii 인코딩 데이터를 사용하고 json 서열기를 사용한다면 엔서어를 주의하십시오ascii 파라미터가 들어갑니다. 그렇지 않으면 출력의 인코딩이 정상적이지 않습니다.
json_serializer = serializers.get_serializer("json")()
json_serializer.serialize(queryset, ensure_ascii=False, stream=response)
시리얼화된 매개변수
시리얼화된 매개변수는 다음과 같은 세 가지 매개변수로 구성된 추가 매개변수를 적용할 수 있습니다.
self.stream = options.pop("stream", StringIO())
self.selected_fields = options.pop("fields", None)
self.use_natural_keys = options.pop("use_natural_keys", False)
stream
시리얼화된 데이터를 stream 흐름에 출력하고 위의 복잡한 쓰기 방법을 연결합니다.
out = open("file.xml", "w")
xml_serializer.serialize(SomeModel.objects.all(), stream=out)
selected_field
서열화된 속성을 선택하고fields 파라미터를 제정함으로써fields는 하나의 원조 파라미터이고 요소는 서열화할 속성을 선택합니다
from django.core import serializers
data = serializers.serialize('xml', SomeModel.objects.all(), fields=('name','size'))
use_natural_keys
자연스러운 키워드를 사용할지 여부는 기본적으로false입니다. (메인 키를 사용합니다.)
기본적인 외부 키와 다중 관계 서열화 정책은 메인 키를 사용합니다. 일반적인 상황에서는 좋지만, 일부 상황에서는 그렇지 않습니다.예를 들어 외부 키가 ContentType에 도착했을 때 ContentType은django의 데이터베이스 프로세스가 동기화될 때 자동으로 생성되기 때문에 그들의 키워드는 쉽게 예측할 수 없다.
하나의 정수 id도 항상 한 대상에게 가장 편리한 인덱스를 만드는 방법은 아니기 때문에 이러한 상황을 바탕으로django는use 를 제공했다natural_keys라는 매개 변수,
하나의natural 키는 메인 키를 사용하지 않고 원소의 속성 조합을 구분할 수 있는 원조이다
natural keys의 해열화
이 두 모델을 고려하다
from django.db import models
class Person(models.Model):
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
class Meta:
unique_together = (('first_name', 'last_name'),)
class Book(models.Model):
name = models.CharField(max_length=100)
author = models.ForeignKey(Person)
기본 Book의 서열화 데이터는 작성자에게 정수 인덱스를 사용합니다. 예를 들어 json을 사용하는 경우, Book의 서열화 데이터는 대략 이렇습니다. 42는 외부 키 Author의 키입니다.
{
"pk": 1,
"model": "store.book",
"fields": {
"name": "Mostly Harmless",
"author": 42
}
}
하지만 이것은 좋은 방법이 아니지 않습니까?너는 이 키가 도대체 어느 Author를 대표하는지 알고, 이 키가 안정적이고 예측할 수 있도록 요구해야 한다.따라서 우리는 자연키의 처리 함수를 추가할 수 있습니다. 대응하는 모델의 관리 모델에 get 를 정의하십시오.by_natural_키 메서드, 예:
from django.db import models
class PersonManager(models.Manager):
def get_by_natural_key(self, first_name, last_name):
return self.get(first_name=first_name, last_name=last_name)
class Person(models.Model):
objects = PersonManager()
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
class Meta:
unique_together = (('first_name', 'last_name'),)
이렇게 한 후 서열화된 결과는 대략 다음과 같다.
{
"pk": 1,
"model": "store.book",
"fields": {
"name": "Mostly Harmless",
"author": ["Douglas", "Adams"]
}
}
natural keys의 서열화
만약 서열화할 때 네이처 키를 사용하고 싶다면, 서열화된 모델 안에 네이처가 있어야 한다.키 방법, 서열화할 때use 사용natural_keys=True 속성은 다음과 같습니다.
class Person(models.Model):
objects = PersonManager()
first_name = models.CharField(max_length=100)
last_name = models.CharField(max_length=100)
birthdate = models.DateField()
def natural_key(self):
return (self.first_name, self.last_name)
class Meta:
unique_together = (('first_name', 'last_name'),)
serializers.serialize('json', [book1, book2], use_natural_keys=True)
참고:naturalkey() 및 getby_natural_키 () 는 동시에 정의된 것이 아닙니다. 만약 Natural keys의 능력을 다시 불러오기만 한다면, Natural 을 정의할 필요가 없습니다.키 () 방법;마찬가지로, 서열화할 때만 이 Natural keys를 출력하고 싶다면 get 를 정의할 필요가 없습니다.by_natural_key () 방법
서열화 과정 중의 의존 관계
natural keys는 데이터베이스 조회에 의존하여 인용을 해석하기 때문에 데이터가 인용되기 전에 데이터가 존재하는지 확인해야 한다.다음 예에서 Book의 Natural key가 책 제목과 저자의 조합이라면 다음과 같이 쓸 수 있습니다.
class Book(models.Model):
name = models.CharField(max_length=100)
author = models.ForeignKey(Person)
def natural_key(self):
return (self.name,) + self.author.natural_key()
그럼 질문이 왔습니다. 만약 Author가 아직 서열화되지 않았다면?Author는 Book 이전에 서열화되어야 합니다. 이를 위해 다음과 같은 의존 관계를 추가할 수 있습니다.
def natural_key(self):
return (self.name,) + self.author.natural_key()
natural_key.dependencies = ['example_app.person']
이는 Person 대상이 Book 대상 이전에 서열화되었음을 보장한다. 마찬가지로 Book을 인용하는 대상은 Person과 Book 대상이 모두 서열화된 후에만 서열화될 수 있다
상속된 모델
추상적인 계승을 사용할 때 이 문제를 신경 쓸 필요가 없다.만약 다중 표 계승을 사용한다면 주의하십시오: 모든 기본 클래스를 서열화해야 합니다. 예를 들어:
class Place(models.Model):
name = models.CharField(max_length=50)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField()
Restaurant 모형만 서열화하면 서버 하나만 얻을 수 있습니다hot_dog 속성, 기본 클래스의 속성은 무시됩니다. 계승된 모든 모델을 동시에 서열화해야 합니다. 다음과 같습니다.
all_objects = list(Restaurant.objects.all()) + list(Place.objects.all())
data = serializers.serialize('xml', all_objects)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Django의 질문 및 답변 웹사이트환영 친구, 이것은 우리의 새로운 블로그입니다. 이 블로그에서는 , 과 같은 Question-n-Answer 웹사이트를 만들고 있습니다. 이 웹사이트는 회원가입 및 로그인이 가능합니다. 로그인 후 사용자는 사용자의 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.