As I showed in the above image, I want to select my favourite items and add it to favourite array. There should be more than 100+ items and every selected item should be store. But Now only last selected item is storing, it replaces others. I think I need to override serializer save method. But how?
Here is my code
models.py
class Item(models.Model):
name = models.CharField(max_length=200)
description = models.TextField(null=True)
cost = models.FloatField(null=True)
categories = models.ManyToManyField('Category')
publishDate = models.DateTimeField(auto_now_add=True, null=True)
image = models.ImageField(null=True, upload_to=item_image_file_path)
views = models.IntegerField(null=True)
def __str__(self):
return self.name
class RegularAccount(models.Model):
username = models.CharField(max_length=200)
dateCreated = models.DateTimeField(auto_now_add=True, null=True)
favourites = models.ManyToManyField('Item')
logo = models.ImageField(null=True, upload_to=regularaccount_logo_file_path)
phone = models.CharField(max_length=200, null=True)
def __str__(self):
return self.username
serializers.py
class FavouriteItems(serializers.ModelSerializer):
"""Serializer for FavouriteItems"""
favourites = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Item.objects.all()
)
class Meta:
model = RegularAccount
fields = ('id', 'favourites',)
views.py
class RegularAccountViewSet(viewsets.ModelViewSet): #Code UNTIL elif self.action ==
'select_favorites': not important
"""Manage RegularAccount in the DB"""
serializer_class = serializers.RegularAccountSerializer
queryset = RegularAccount.objects.all()
def get_queryset(self):
"""Get queryset"""
return self.queryset
def get_serializer_class(self):
"""Return appropriate serializer class"""
if self.action == 'retrieve':
return serializers.RegularAccountSerializerDetail
elif self.action == 'upload_image':
return serializers.RegularImageSerializer ##UNTIL HERE IMPORTANT
elif self.action == 'select_favorites':
return serializers.FavouriteItems
return self.serializer_class
def perform_create(self, serializer):
"""Create a new object"""
serializer.save()
@action(methods=['POST', 'GET'], detail=True, url_path='favourites')
def select_favorites(self, request, pk=None):
"""Favorites for regularaccount"""
favourites = self.get_object()
serializer = self.get_serializer(
favourites,
data=request.data
)
if serializer.is_valid():
serializer.save()
return Response(
serializer.data,
status=status.HTTP_200_OK
)
return Response(
serializer.errors,
status=status.HTTP_400_BAD_REQUEST
)
to override the save/create do the following:
Add the create function to your modelSerializer. it should look something like this
class FavouriteItems(serializers.ModelSerializer):
"""Serializer for FavouriteItems"""
favourites = serializers.PrimaryKeyRelatedField(
many=True,
queryset=Item.objects.all()
)
class Meta:
model = RegularAccount
fields = ('id', 'favourites',)
def create(self, validated_data):
# do something
return # return some object
check the docs: https://www.django-rest-framework.org/api-guide/serializers/ under the modelserializer section for more information and examples.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.