33
loading...
This website collects cookies to deliver better user experience
Original Post in https://skamalakannan.dev/posts/django-rest-framework-tips/
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__'
CreatedModifiedSerializer
as a mixin. It will get applied to the OrderSerializer
, if the Order
doesn't have any one of the fields declared in the mixin, we will receive an exception.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
is a property, it will pick it directly. We can also declare the field type, specify as read-only, or result in an AttributeError
exception.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__'
PresentablePrimaryKeyRelatedField
from the drf-extra-fields package for this purpose.queryset
of the model, and another one presentation_serializer
is a serializer class for the model.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__'