- MVC
- Зачем нужен DRF
- Зачем нужен DRF
- JWT
- Зачем нужен DRF
- Serializers
- Serializers. Валидация
- Serializers. Default
- ViewSet
- ViewSet. Ограничение на методы
- ViewSet. create / performe_create
- ViewSet. get_serializer_class
- Permissions
- Permissions
- Permissions
- Паджинация
- Throttling
- Фильтрация
- Дополнительная литература
- CRUD
- Права доступа
- Сериализация
import json
from django.db import Model
class MyModel(Model):
...
def to_json(self):
...
Зачем тогда нужны сериализаторы?
- JSON
- XML
- YAML
- многие другие
def validate_<field>(self, field):
if ...:
raise serializers.ValidationError
return field
def validate(self, items):
return items
def perform_create(self, serializer):
serializer.save(
owner=self.request.user
)
Это плохой стиль! Необходимо использовать:
class ModelViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet
):
- Можно наследоваться не от ModelViewSet, а создать свой набор миксинов
class SnippetsViewSet(
mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.ListModelMixin
):
- Можно использовать http_method_names
class SnippetsViewSet(ModelViewSet):
...
http_method_names = ["get", "post"]
class CreateModelMixin:
"""
Create a model instance.
"""
def create(self, request, *a, **k):
serializer = self.get_serializer(
data=request.data)
serializer.is_valid(
raise_exception=True)
self.perform_create(serializer)
# ...
def perform_create(self, serializer):
serializer.save()
- Django-Filter иногда бывает слишком громоздким решением для простой задачи
def get_queryset(self):
langs = (
self.request.query_params
.getlist('langs')
)
qs = Recipe.objects
if tags:
qs = qs.filter(language__in=langs)
# if self.request.query_params.get(
# 'is_favorited'):
# qs = qs.filter(is_favorited=True)
return qs