Как использовать ListSerializer для создания и обновления нескольких записей в django rest framework?
Вот способ создания и обновления нескольких записей одновременно в django rest framework с помощью ListSerializer. Этот способ очень удобен и дает быстрый отклик.
Когда вы хотите создать объект, передайте id: null, потому что id является обязательным полем, а когда вы хотите обновить записи, передайте конкретный id.
Вот ответ:
models.py
class BookDetail(models.Model):
author = models.ForeignKey('bookapp.Author', null=True, on_delete=models.CASCADE)
title = models.CharField(max_length=255, null=True, blank=True)
price = models.CharField(max_length=100, null=True, blank=True)
discount = models.FloatField(default=0)
tax_percentage = models.IntegerField(default=0)
total_price = models.FloatField(default=0)
created_at = models.DateTimeField(auto_now_add=True, editable=False)
modified_at = models.DateTimeField(auto_now=True)
serializer.py
class BookDetailsListSerializer(serializers.ListSerializer):
def update(self, instance, validated_data):
# Perform creations and updates.
ret = []
for data in validated_data:
if "id" in data and data['id'] not in ['', None]:
BookDetail.objects.filter(id=data['id']).update(**data)
ret.append(data)
else:
ret.append(BookDetail.objects.create(**data))
return ret
class BookDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = BookDetail
fields = ['id', 'author', 'title', 'price', 'discount', 'tax_percentage', 'total_price']
list_serializer_class = BookDetailsListSerializer
extra_kwargs = {
# We need to identify elements in the list using their primary key,
# so use a writable field here, rather than the default which would be read-only.
'id':{
'read_only': False,
'allow_null': True,
},
'author':{
'required': True,
},
'title':{
'required': True,
},
'price':{
'required': True,
},
'discount':{
'required': True,
},
'tax_percentage':{
'required': True,
},
'total_price':{
'required': True,
}
}
urls.py
path('book-details', views.BookDetailsView.as_view()),
views.py
class BookDetailsView(APIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
serializer_class = BookDetailsSerializer
def get(self, request, *args, **kwargs):
author_id = request.GET.get('author_id', None)
bookdtl_obj = BookDetail.objects.filter(author__id=a)
serializer = self.serializer_class(bookdtl_obj, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request, *args, **kwargs):
data = request.data
serializer = self.serializer_class(instance='',data=data, many=True)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)