صفحه اصلی >> بلاگ >> ساخت یک Serializer قدرتمند با فریمورک جنگو

ساخت یک Serializer قدرتمند با فریمورک جنگو

دسته:django تاریخ انتشار: 6 فوریه 2021 ایمان رضایی

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 را که روش ذخیره سریال را فراخوانی می کند ، تأیید می کند.


n0
n238

برای ثبت نظر باید وارد سایت شوید یا ثبت نام نمایید.


نظر شما با موفقیت در سیستم ثبت گردید.