Abdullahil Kafi
Abdullahil Kafi

Reputation: 27

How to insert data into two model from one viewset action in django rest framework

I have two models Purchase and Transaction. I need to insert data into Transaction model whenever data insert into Purchase model. A purchase must have a corresponding transaction.

Purchase Model is-

class Purchase(models.Model):
    date = models.DateField(blank=True)
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, null=True, blank=True
    )
    quantity = models.FloatField()
    amount = models.FloatField()
    from_head = models.ForeignKey(Head, on_delete=models.CASCADE, null=True, blank=True)
    from_subhead = models.ForeignKey(SubHead,on_delete=models.CASCADE,null=True,blank=True,)
    to_head = models.ForeignKey(Head, related_name="purchase_to_head", on_delete=models.CASCADE, 
       null=True, blank=True,)
    to_subhead = 
models.ForeignKey(SubHead,related_name="purchase_to_subhead",on_delete=models.CASCADE,null=True,blank=True,)

Transaction Model is-

class Transaction(models.Model):
    class TypeList(models.TextChoices):
        IN = "IN"
        OUT = "OUT"

    class PaymentType(models.TextChoices):
        CASH = "CASH"
        DUE = "DUE"

    date = models.DateField(blank=True)
    purchase = models.ForeignKey(
        Purchase, on_delete=models.CASCADE, null=True, blank=True
    )
    sale = models.ForeignKey(Sale, on_delete=models.CASCADE, null=True, blank=True)
    product = models.ForeignKey(
        Product, on_delete=models.CASCADE, null=True, blank=True
    )
    type = models.CharField(max_length=10, choices=TypeList.choices)
    payment_type = models.CharField(max_length=10, choices=PaymentType.choices)
    amount = models.FloatField()
    from_head = models.ForeignKey(Head, on_delete=models.CASCADE, null=True, blank=True)
    from_subhead = models.ForeignKey(SubHead, on_delete=models.CASCADE, null=True, blank=True,)
    to_head = models.ForeignKey(Head, related_name="trans_to_head", on_delete=models.CASCADE, null=True, blank=True,)
    to_subhead = models.ForeignKey(SubHead, related_name="trans_to_subhead", on_delete=models.CASCADE, null=True,blank=True,)

Purchase and Transaction Serializer are-

class PurchaseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Purchase
        fields = "__all__"


class TransactionSerializer(serializers.ModelSerializer):
    class Meta:
        model = Transaction
        fields = "__all__"

Purchase and Transaction Viewsets are-

class PurchaseView(viewsets.ModelViewSet):
    serializer_class = PurchaseSerializer
    queryset = Purchase.objects.all()


class TransactionView(viewsets.ModelViewSet):
    serializer_class = TransactionSerializer
    queryset = Transaction.objects.all()

How can I inert data into two model from one viewset action. Please help me.

Upvotes: 1

Views: 885

Answers (1)

Arjun Shahi
Arjun Shahi

Reputation: 7330

You can override the perform_create method in your viewset.

from django.db import transaction 

class PurchaseView(viewsets.ModelViewSet):
    serializer_class = PurchaseSerializer
    queryset = Purchase.objects.all()

    def perform_create(self, serializer):
        with transaction.atomic():
            purchase = serializer.save()
            # create transaction model now.
            Transaction.objects.create(purchase=purchase, type='IN',....)

Upvotes: 1

Related Questions