Переопределение create() для общих представлений на основе классов

Как я могу выполнить некоторую логику перед сохранением записи в моем общем представлении? Я полагаю, что логика сохранения происходит внутри super().create().

class WalletListCreateAPIView(generics.ListCreateAPIView):
    queryset = Wallet.objects.all()
    serializer_class = WalletSerializer

    def create(self, request, *args, **kwargs):
        # Some logic here prior to saving
        return super().create(request, *args, **kwargs)

Например, я хотел бы создать значение для balance вместо того, чтобы полагаться на значение из запроса

class Wallet(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    address = models.CharField(max_length=34)
    balance = models.DecimalField(default=0, max_digits=16, decimal_places=8)
    slug = models.SlugField(max_length=34, blank=True, null=True)

Я понимаю вашу проблему.

вы хотите переопределить метод create в generics.ListCreateAPIView.

Итак, вы должны определить некоторый метод, здесь вы хотите создать новую запись, поэтому вы хотите определить метод post и в методе post вы можете переопределить метод create.

class WalletListCreateAPIView(generics.ListCreateAPIView):
   queryset = Wallet.objects.all()
   serializer_class = WalletSerializer

   def post(self, request, *args, **kwargs):
      return self.create(request, *args, **kwargs)

ПРИМЕЧАНИЕ: - в соответствии с вашей моделью Wallet поле адреса не пустое, поэтому у вас должен быть передан адрес. затем запустите его.

Это поток, когда вы сохраняете данные запроса в модель Также, пожалуйста, проверьте синтаксис create -> perform_create -> serializer's create back to perform create then back to create

class WalletListCreateAPIView(generics.ListCreateAPIView):
    queryset = Wallet.objects.all()
    serializer_class = WalletSerializer

    def create(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        wallet = self.perform_create(serializer)
        headers = self.get_success_headers(serializer.data)

        return Response(
            self.get_response_data(user),
            status=status.HTTP_201_CREATED,
            headers=headers,
        )


    def perform_create(self, serializer):
        wallet = serializer.save(user=self.request.user) # if you want to change how you want to save from serializer to your model then you should override create method of serializer as I have shown below
        wallet.balance = 30
        wallet.save()
        return wallet


# serializers.py
class WalletSerializer(serializers.ModelSerializer):
    class Meta:
        model = Wallet
        fields = "__all__"
    def create(self, validated_data):
        # here in validated data you will receive your request data after validation  If you want to discard any request value you can do here
        balance = validated_data.pop("balance", None)
        wallet = Wallet.objects.create(**validated_data)
        return wallet

Вы можете переопределить метод сохранения модели

class Wallet(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    address = models.CharField(max_length=34)
    balance = models.DecimalField(default=0, max_digits=16, decimal_places=8)
    slug = models.SlugField(max_length=34, blank=True, null=True)
    
    def save(self, *args, **kwargs):
      if not self.pk:
         #You can write own logic here
         self.balance = 10 
       super(Wallet, self).save(*args, **kwargs)


Вернуться на верх