#python #django
#python #django
Вопрос:
Как я показал на приведенном выше изображении, я хочу выбрать мои любимые элементы и добавить их в избранный массив. Должно быть более 100 элементов, и каждый выбранный элемент должен быть сохранен. Но теперь сохраняется только последний выбранный элемент, он заменяет другие. Я думаю, мне нужно переопределить метод сохранения сериализатора. Но как?
Вот мой код
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
)
Ответ №1:
чтобы переопределить сохранение / создание, выполните следующее:
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
проверьте документы: https://www.django-rest-framework.org/api-guide/serializers дополнительную информацию и примеры можно найти в разделе modelserializer.