[FIXED] Überschreiben von create() für klassenbasierte generische Ansichten

Ausgabe

Wie kann ich eine Logik ausführen, bevor ich einen Datensatz in meiner generischen Ansicht speichere? Ich glaube, die eigentliche Sparlogik findet innerhalb statt super().create().

Die Anfrage darin create()sieht so aus

<QueryDict: {'csrfmiddlewaretoken': ['5WvMZnoBMCUjmlMBaacLnx6Pxt3jUDvHWHvo90ORumYrClkebcx7NJZpmWASRIyG'], 'user': ['1'], 'address': ['3E8ociqZa9mZUSwGdSmAEMAoAxBK3FNDcd']}>

Aussicht

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)

Zum Beispiel möchte ich den Wert für erstellen, balanceanstatt mich auf den Wert aus der Anfrage zu verlassen

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)

Lösung

Dies ist der Ablauf, wenn Sie Ihre Anforderungsdaten im Modell speichern. Überprüfen Sie auch die Syntax create -> perform_create -> serializer’s create back to perform create dann 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


Beantwortet von –
Deepak Tripathi


Antwort geprüft von –
Dawn Plyler (FixError Volunteer)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like