简体   繁体   中英

django overriding serializer save() method

图片

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM