# OKRE: Technical Standard
# Django: Serializer
* [How To Use DRF Serializers Effectively in Django](https://medium.com/better-programming/how-to-use-drf-serializers-effectively-dc58edc73998)
* [How to use DRF serializers effectively during write operations](https://medium.com/@raaj.akshar/how-to-effectively-use-django-rest-framework-serializers-during-write-operations-dd73b62c26b5)
📝 **Easy serializer of AbstractSoftDeletionModelController**
```
class Product(AbstractSoftDeletionModelController):
name = models.CharField(max_length=255, db_index=True, null=True, blank=True)
code = models.CharField(max_length=255, db_index=True, null=True, blank=True)
length = models.DecimalField(max_digits=11, decimal_places=3, default=0, verbose_name='Length')
class Meta:
verbose_name_plural = 'Products'
def __str__(self):
return f'{self.code}: {self.name}'
```
```
class ProductSerializer(ModelControllerSerializer):
id = serializers.IntegerField(required=False, allow_null=True)
class Meta:
model = Product
exclude = EXCLUDE_COMMON_FIELDS
```
📝 **To include the parent relation you only need to include its serializer and include it in the fields list.**
```
class WithdrawalReturn(AbstractSoftDeletionModelController):
producing_date = models.DateField(verbose_name='Producing Date')
class Meta:
verbose_name_plural = 'Withdrawal Return'
def __str__(self):
return f'{self.id}: {self.producing_date}'
```
```
class WithdrawalReturnItem(AbstractSoftDeletionModelController):
withdrawal_return = models.ForeignKey(
to='withdrawal_return.WithdrawalReturn',
on_delete=models.CASCADE,
db_index=True,
related_name='items',
verbose_name='Withdraw Return'
)
withdraw_amount = models.DecimalField(
max_digits=10,
decimal_places=3,
default=0,
verbose_name='Withdraw Amount',
)
class Meta:
verbose_name_plural = 'Withdrawal Return Items'
```
```
class WithdrawalReturnItemSerializer(ModelControllerSerializer):
id = serializers.IntegerField(required=False, allow_null=True)
class Meta:
model = WithdrawalReturnItem
exclude = EXCLUDE_COMMON_FIELDS
extra_kwargs = {
'withdrawal_return': {'read_only': True}
}
class WithdrawalReturnSerializer(ModelControllerSerializer):
items = WithdrawalReturnItemSerializer(many=True)
class Meta:
model = WithdrawalReturn
exclude = EXCLUDE_COMMON_FIELDS
```
📝 **ModelSerializer using model property (this work with version 3.8.2)**
```
class MyModelSerializer(serializers.ModelSerializer):
ext_link = serializers.ReadOnlyField()
class Meta:
model = MyModel
fields = "__all__"
```
Other read: https://www.django-rest-framework.org/api-guide/serializers/
# Django: Filter
Busy wait me gon 😭😭😭
# Export/Import excel
🔗 Import excel use django-excel-tools (by Maintainers: khemanorak) is Good!
https://pypi.org/project/django-excel-tools/
🔗 Export excel use Openpyxl
https://openpyxl.readthedocs.io/en/stable/
# Pdf generate
🔗 django-weasyprint
https://www.bedjango.com/blog/how-generate-pdf-django-weasyprint/
# Optimize query
Busy wait me gon 😭😭😭