django переопределяет метод сохранения сериализатора()

#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.