Reputation: 27
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
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