بهترین روش یادگیری یه فریم ورک خوندن کد خود فریم ورک و داکیومنت توی خود کد هست. برای serializer توی جنگو یک کامنت هست توی rest_framework/serializer.py که:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
class BaseSerializer(Field): """ The BaseSerializer class provides a minimal class which may be used for writing custom serializer implementations. Note that we strongly restrict the ordering of operations/properties that may be used on the serializer in order to enforce correct usage. In particular, if a `data=` argument is passed then: .is_valid() - Available. .initial_data - Available. .validated_data - Only available after calling `is_valid()` .errors - Only available after calling `is_valid()` .data - Only available after calling `is_valid()` If a `data=` argument is not passed then: .is_valid() - Not available. .initial_data - Not available. .validated_data - Not available. .errors - Not available. .data - Available. """ def __init__(self, instance=None, data=empty, **kwargs):. . . |
خیلی خوب توضیح میده که اگر به serializer پارامتر data رو پاس داده باشیم تابع is_valid قابل استفاده است. و initial_data هم در دسترس هست که همون دیتایی هست که به API پاس داده شده. بعد از is_valid این داده ورودی به valid شده تبدیل میشه که میتونیم توی validated_data ببینیم. مثلا اگر Id به object مربوطه تبدیل میشه. و errors و data هم در دسترس خواهد بود. data درواقع اون رکورد جدیدی هست که ایجاد شده است.
مثال زیر رو ببینید:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) if not serializer.is_valid(): return Response( {"errors": serializer.errors}, status.HTTP_400_BAD_REQUEST ) self.perform_create(serializer) print("-----------------------------") print(serializer.initial_data) print(serializer.validated_data) print(serializer.errors) print(serializer.data) create_update_related_chain(serializer.instance, False) return Response(serializer.data, status.HTTP_201_CREATED) |
میبینید که بعد serializer.is_valid() مقادیر مربوطه رو پرینت کردم.
مثال خروجی هم در ادامه میبینید:
1 2 3 4 5 |
----------------------------- {'provider': 159, 'consumer': 156, 'interface': 164, 'interface2': 161, 'protocol': 2, 'lt': 0, 'description': '', 'api': '', 'frequency': 0, 'ProviderVerified': False, 'ConsumerVerified': False, 'ESBVerified': False, 'api_gateway': False, 'active': False} OrderedDict({'provider': <Service: Active probe(pixip)>, 'consumer': <Service: AOTA(hasin)>, 'interface': <Service: Behsa Proxy(external)>, 'interface2': <Service: GFEP(external)>, 'protocol': <Protocol: SFTP>, 'lt': 0, 'description': '', 'api': '', 'frequency': 0.0, 'ProviderVerified': False, 'ConsumerVerified': False, 'ESBVerified': False, 'api_gateway': False, 'active': False}) {} {'id': 1303, 'provider': 159, 'provider_name': 'active_probe', 'consumer': 156, 'consumer_name': 'aota', 'interface': 164, 'interface_name': 'behsa_proxy', 'interface2': 161, 'interface2_name': 'gfep', 'protocol': 2, 'protocol_name': 'sftp', 'lt': 0, 'lt_display': 'COMMAND', 'description': '', 'api': '', 'frequency': 0.0, 'ProviderVerified': False, 'ConsumerVerified': False, 'ESBVerified': False, 'api_gateway': False, 'active': False} |