Оригинальный пост в https://skamalakannan.dev/posts/django-rest-framework-tips/
Django Rest Framework – это мощный инструмент для создания API, и он поставляется с большим количеством функций. Вот список советов, которые помогут в разработке вашего API лучше.
Отправка общего поля во всех ответах
Возможно, у нас могут быть использованы случаи, когда мы хотим много отправлять во все наши ответы, такие как Resource URI, создание даты или созданные пользовательские поля. Мы можем использовать сериализаторы Mixins для этой цели. Мистины – это абстрактные классы, и мы можем определить все переменные в этих смеси, и мы можем наследовать эти смеси к фактическому классу.
from user.serializers import UserMinimumSerializer class CreatedModifiedSerializer(serializers.Serializer): created_date = serializers.DateTimeField(read_only=True) created_by = UserMinimumSerializer(read_only=True) modified_date = serializers.DateTimeField(read_only=True) modified_by = UserMinimumSerializer(read_only=True) class Meta: abstract = True class OrderSerializer(CreatedModifiedSerializer): class Meta: model = Order fields = '__all__'
В приведенном выше примере мы создали СозданиеModifiedSerializer
как микс. Это применится к Oorderializer
, если Заказать
Нет ни одного из областей, объявленных в мистине, мы получим исключение.
Вернуть вычисленное значение из модели
Если у вас есть сценарий, это отправить вычисленное значение. Мы можем создать недвижимость для модели и указать имя свойства непосредственно в классе Serializer.
class Order(models.Model): qty = models.IntegerField() price_per_qty = models.DecimalField(max_digits=5, decimal_places=2, default=0.0) @property def total_amount(self): return self.qty * self.price_per_qty class OrderSerializer(models.ModelSerializer): class Meta: model = Order fields = ('qty', 'price_pert_qty', 'total_amount') #Total amount is property of the model
С total_amount
это недвижимость, он заберет его напрямую. Мы также можем объявить тип поля, указать как только для чтения, или приведет к AttributeError
исключение.
Сохранение вложенного сериализатора
Если мы хотим создать или обновить соотношение вложенной модели. DRF-reciated – это пакет, который приходит для спасения; Он поддерживает вложенный сериализатор как создание и обновления операций. Это также доступно поддержки для OneToone, Internalke, Manytomany. https://github.com/beda-software/drf-writable-nested
from drf_writable_nested.serializers import WritableNestedModelSerializer from rest_framework.serializers import ModelSerializer class OrderItemSerializer(ModelSerializer): class Meta: model = OrderItems fields = '__all__' class OrderSerializer(WritableNestedModelSerializer): items = OrderItemSerializer(many=True) class Meta: model = Order fields = '__all__'
Примите идентификатор объекта во время создания и обновления, возвращайте объект через сериализатор
По умолчанию DRF принимает и возвращает поле в том же формате. Если корпус использования состоит в том, чтобы принять обновление ID и создать, но верните сериализованный объект. Мы можем использовать Представемоепримаркирееленое поле
из пакета DRF-Extra-поля для этой цели. Пользовательское поле принимает два аргумента, одна из которых Queryset
модели, а также еще один stentation_serializer
это класс сериализатора для модели.
from drf_extra_fields.relations import PresentablePrimaryKeyRelatedField from rest_framework.serializers import ModelSerializer class OrderSerializer(ModelSerializer): items = OrderItemSerializer(many=True) order_type = PresentablePrimaryKeyRelatedField( queryset = OrderType.objects.all(), presentation_serializer=OrderTypeSerializer ) class Meta: model = Order fields = '__all__'
DRF-Extra-поля Имеет много настраиваемых полей, таких как Base64Imagefield
, он примет файл изображения Как кодируется Base64 и вернется в виде файла изображения. Пожалуйста, оформить заказ https://github.com/hipo/drf-extra-fields для дополнительной информации
Оригинал: “https://dev.to/srkama/django-rest-framework-tips-and-tricks-276b”