1. 程式人生 > >django雜記(cookiecutter-django / django-rest-framework序列化)

django雜記(cookiecutter-django / django-rest-framework序列化)

2018-09-26

Django Rest Framework Authentication Tutorial

urlpatterns = [
    path('', views.PostList.as_view()),
    path('<int:pk>/', views.PostDetail.as_view()),
]

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('posts.urls')),
]

include_app_namespace

URL namespaces¶

# 變數__file__指當前檔案(包含這個程式碼的檔案)
# os.path.abspath(__file__)) 得到檔案所在目錄
# 再來一個os.path.abspath就是上一級目錄
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

POST 請求---------> 反序列化過程-------> deserializer: Json → native datatype【data = JSONParser().parse(BytesIO(content))】 → isntance【serializer = SnippetSerializer(data=data) serializer.is_valid()# True serializer.save()】

GET 請求 ----------> 序列化過程----------> serilization : isntance(django 模型例項) → native datatype(python 原生資料型別)【serializer.data】 → Json【JSONRenderer().render(serializer.data)】,將model例項的轉為json格式response出去。

postgresql中JsonField欄位:

class JSONField(CheckFieldDefaultMixin, Field):
    empty_strings_allowed = False
    description = _('A JSON object')
    default_error_messages = {
        'invalid': _("Value must be valid JSON."),
    }
    _default_hint = ('dict', '{}')

    def __init__(self, verbose_name=None, name=None, encoder=None, **kwargs):
        if encoder and not callable(encoder):
            raise ValueError("The encoder parameter must be a callable object.")
        self.encoder = encoder
        super().__init__(verbose_name, name, **kwargs)

    def db_type(self, connection):
        return 'jsonb'

    def deconstruct(self):
        name, path, args, kwargs = super().deconstruct()
        if self.encoder is not None:
            kwargs['encoder'] = self.encoder
        return name, path, args, kwargs

    def get_transform(self, name):
        transform = super().get_transform(name)
        if transform:
            return transform
        return KeyTransformFactory(name)

    def get_prep_value(self, value):
        if value is not None:
            return JsonAdapter(value, encoder=self.encoder)
        return value

    def validate(self, value, model_instance):
        super().validate(value, model_instance)
        options = {'cls': self.encoder} if self.encoder else {}
        try:
        	# json資料進行loads
            json.dumps(value, **options)
        except TypeError:
            raise exceptions.ValidationError(
                self.error_messages['invalid'],
                code='invalid',
                params={'value': value},
            )