Serialization داده ها را به فرمت قابل ذخیره یا انتقال تبدیل می کند و سپس آنها را برای استفاده بازسازی می کند. DRF شناخته شده ترین سریال سازها را دارد.
Serialization فرآیند تبدیل داده به فرمت قابل ذخیره یا انتقال و سپس بازسازی آن است. این در هنگام توسعه برنامه ها یا ذخیره داده ها در پایگاه داده ، در حافظه ، یا تبدیل آن به فایل ، همیشه مورد استفاده قرار می گیرد.
فرض کنید شما در حال ایجاد نرم افزاری برای یک سایت تجارت الکترونیکی هستید و سفارشی دارید که خرید یک محصول واحد توسط شخصی را با قیمت و در یک تاریخ ثبت می کند:
class Order:
def __init__(self, product, customer, price, date):
self.product = product
self.customer = customer
self.price = price
self.date = date
حال ، تصور کنید که می خواهید داده های سفارش را از یک پایگاه داده key-value ذخیره و بازیابی کنید. خوشبختانه ، رابط کاربری آن dictionary را می پذیرد و پس می دهد ، بنابراین شما باید شی object خود را به dictionary تبدیل کنید:
def serialize_order(order):
return {
'product': order.product,
'customer': order.customer,
'price': order.price,
'date': order.date
}
و اگر می خواهید برخی از داده ها را از آن پایگاه داده دریافت کنید ، می توانید داده های dict را بدست آورید و آن را به هدف Order خود تبدیل کنید:
def deserialize_order(order_data):
return Order(
product=order_data['product'],
customer=order_data['customer'],
price=order_data['price'],
date=order_data['date'],
)
انجام این کار با داده های ساده بسیار سرراست است ، اما هنگامی که شما نیاز دارید با اشیا پیچیده ساخته شده از ویژگی های پیچیده کنار بیایید ، این روش مقیاس خوبی ندارد. همچنین باید اعتبارسنجی انواع مختلف زمینه ها را کنترل کنید و این کار بصورت دستی و زمانبر است.
این همان جایی است که سریال فریمورک های Serializer مفید هستند. آنها به شما این امکان را می دهند که serializer های کوچک را ایجاد کنید که برای موارد پیچیده شما کار کنند.
جنگو دارای یک ماژول serialization است که به شما امکان می دهد مدل ها را به قالب های دیگر "ترجمه" کنید:
from django.core import serializers
serializers.serialize('json', Order.objects.all())
این مورد بیشترین موارد مورد استفاده برای برنامه های وب مانند JSON ، YAML و XML را پوشش می دهد. اما همچنین می توانید از serializer های ساخته شده استفاده کنید یا خودتان ایجاد کنید. شما فقط باید آن را در پرونده settings.py خود ثبت کنید:
# settings.py
SERIALIZATION_MODULES = {
'my_format': appname.serializers.MyFormatSerializer,
}
برای ایجاد MyFormatSerializer خود ، باید روش .serialize() را پیاده سازی کنید و یک queryset و گزینه های اضافی را به عنوان params بپذیرید:
class MyFormatSerializer:
def serialize(self, queryset, **options):
# serious serialization happening
اکنون می توانید queryset خود را به قالب جدید خود serialize کنید:
from django.core import serializers
serializers.serialize('my_format', Order.objects.all())
می توانید از پارامترهای گزینه برای تعیین رفتار serializer خود استفاده کنید. به عنوان مثال ، اگر می خواهید هنگام کار با ForeignKeys با serialization تو در تو کار کنید یا فقط می خواهید این داده ها کلیدهای اصلی خود را برگردانند ، می توانید پارامتر flat = True را به عنوان optionsارسال کرده و در تابع خود از آن استفاده کنید روش شما:
class MyFormatSerializer:
def serializer(self, queryset, **options):
if options.get('flat', False):
# don't recursively serialize relationships
# recursively serialize relationships
یکی از راه های استفاده از serialization جنگو استفاده از دستورات مدیریت loaddata و dumpdata است.
DRF Serializers
در انجمن جنگو ، فریم ورک Django REST (DRF) شناخته شده ترین سریال سازها را ارائه می دهد. اگرچه می توانید از Serializer های Django برای ساخت JSON استفاده کنید که در API خود به آن پاسخ خواهید داد ، اما سریال ساز چارچوب REST دارای ویژگی های خوبی است که به شما کمک می کند داده های پیچیده را مدیریت کرده و به راحتی اعتبار سنجی کنید.
در مثال Order ، می توانید یک سریال ساز مانند این ایجاد کنید:
from restframework import serializers
class OrderSerializer(serializers.Serializer):
product = serializers.CharField(max_length=255)
customer = serializers.CharField(max_lenght=255)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
date = serializers.DateField()
و داده های آن را به راحتی سریال کنید:
order = Order('pen', 'renato', 10.50, date.today())
serializer = OrderSerializer(order)
serializer.data
# {'product': 'pen', 'customer': 'renato', 'price': '10.50', 'date': '2020-08-16'}
برای اینکه بتوانید یک نمونه را از داده برگردانید ، باید دو تابع را ایجاد کنید - ایجاد و به روزرسانی:
from rest_framework import serializers
class OrderSerializer(serializers.Serializer):
product = serializers.CharField(max_length=255)
customer = serializers.CharField(max_length=255)
price = serializers.DecimalField(max_digits=5, decimal_places=2)
date = serializers.DateField()
def create(self, validated_data):
# perform order creation
return order
def update(self, instance, validated_data):
# perform instance update
return instance
پس از آن ، می توانید با فراخوانی is_valid() مصادیق را ایجاد یا به روز کنید تا داده ها را تأیید کرده و برای ایجاد یا به روزرسانی نمونه save() را فراخوانی کنید:
serializer = OrderSerializer(**data)
## to validate data, mandatory before calling save
serializer.is_valid()
serializer.save()
Model serializers
هنگام سریال سازی داده ها ، اغلب باید این کار را از طریق پایگاه داده انجام دهید ، بنابراین از طریق مدل های خود انجام می شود. ModelSerializer ، مانند ModelForm ، یک API برای ایجاد سریال ساز از مدل های شما فراهم می کند. فرض کنید شما یک مدل سفارش دارید:
from django.db import models
class Order(models.Model):
product = models.CharField(max_length=255)
customer = models.CharField(max_length=255)
price = models.DecimalField(max_digits=5, decimal_places=2)
date = models.DateField()
می توانید برای آن یک serializer درست کنید:
from rest_framework import serializers
class OrderSerializer(serializers.ModelSerializer):
class Meta:
model = Order
fields = '__all__'
جنگو به طور خودکار تمام قسمتهای مدل را در serializer گنجانده و توابع createو update را ایجاد می کند.
استفاده از سریال سازها در class-based views (CBV)
مانند فرم ها با CBV های جنگو ، سریال سازها به خوبی با DRF ها ادغام می شوند. می توانید ویژگی serializer_class را تنظیم کنید تا سریال ساز در معرض نمایش قرار گیرد:
from rest_framework import generics
class OrderListCreateAPIView(generics.ListCreateAPIView):
queryset = Order.objects.all()
serializer_class = OrderSerializer
همچنین می توانید تابع serializer_class را تعریف کنید:
from rest_framework import generics
class OrderListCreateAPIView(generics.ListCreateAPIView):
queryset = Order.objects.all()
def get_serializer_class(self):
if is_free_order():
return FreeOrderSerializer
return OrderSerializer
روشهای دیگری نیز در CBV وجود دارد که با سریال سازها تعامل دارند. به عنوان مثال ، get_serializer() یک serializer از قبل فوری را برمی گرداند ، در حالی که get_serializer_context() آرگومان هایی را که هنگام ایجاد نمونه خود به serializer ارسال می کنید ، برمی گرداند. برای viewهایی که داده ها را ایجاد یا به روز می کنند ، create و update وجود دارد که داده ها را با روش is_valid ذخیره می کند و perform_create و perform_update را که روش ذخیره سریال را فراخوانی می کند ، تأیید می کند.
برای ثبت نظر باید وارد سایت شوید یا ثبت نام نمایید.
نظر شما با موفقیت در سیستم ثبت گردید.