Рубрики
Без рубрики

Django Ress Framework Tips и Tricks

Оригинальный пост в https://skamalakannan.dev/posts/django-rest-framework-tips/ django Read Framework … Помечено Django, DjangorestFramework, Python.

Оригинальный пост в 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”