spraj
spraj

Reputation: 65

Why the data is not being saved in another model?

class AdvancePaymentCreateSerializer(serializers.ModelSerializer):
PAYMENT_MODE = (
    ("cash", "Cash"),
    ("cheque", "Cheque"),
    ("upi", "UPI"),
    ("imps", "IMPS"),
    ("neft", "NEFT"),
    ("rtgs", "RTGS"),
    ("demand_draft", "Demand Draft"),
)
STATUS = (
    ("pending", "Pending"),
    ("hold", "Hold"),
    ("completed", "Completed"),
    ("canceled", "Canceled"),
)
center = serializers.PrimaryKeyRelatedField(queryset=center_models.Centers.objects.all(), many=True)
payment_date = serializers.DateField(required=False, allow_null=True)
amount = serializers.FloatField(required=False, allow_null=True)
payment_mode = serializers.ChoiceField(choices=PAYMENT_MODE)
cash_receipt_no = serializers.CharField(max_length=100, required=False, allow_null=True)
invoice_no = serializers.CharField(max_length=100, required=False, allow_null=True)
remarks = serializers.CharField(max_length=255, required=False, allow_null=True)
status = serializers.ChoiceField(choices=STATUS)
center_balance = serializers.FloatField(required=False, allow_null=True)
payment_receipt = serializers.FileField(required=False, allow_null=True, allow_empty_file=False,
        use_url=True)
is_active = serializers.BooleanField(default=True)


class Meta:
    model = package_models.AdvancePayment
    fields = "__all__"

def create(self, validated_data):
    center = validated_data.get("centre")
    payment_date = validated_data.get("payment_date")
    amount = validated_data.get("amount")
    payment_mode = validated_data.get("payment_mode")
    cash_receipt_no = validated_data.get("cash_receipt_no")
    invoice_no = validated_data.get("invoice_no")
    remarks = validated_data.get("remarks")
    status = validated_data.get("status")
    center_balance = validated_data.get("center_balance")
    payment_receipt = validated_data.get("payment_receipt")
    is_active = validated_data.get("is_active")

    obj = package_models.AdvancePayment.objects.create(
        center=center,
        payment_date=payment_date,
        amount=amount,
        payment_mode=payment_mode,
        cash_receipt_no=cash_receipt_no,
        invoice_no=invoice_no,
        remarks = remarks,
        status = status,
        center_balance = center_balance,
        payment_receipt = payment_receipt,
        
        is_active = is_active
    )
    ledger = package_models.CollectionCenterLedger(
        ledger_type="credit",
        amount=amount,
        center_id=center,
        remarks="Advanced Amount by Center"
    ).save()
    
    center=center_models.Centers.objects.get_or_create(id=center).first()
    center.rcl_amount =float(center.rcl_amount) + float(amount)
    center.save()
    obj.center_balance =center.rcl_amount
    obj.save()
    ledger.center_rem_balance=center.rcl_amount
    ledger.save()
    obj.save()
    return obj

This is create serializer of AdvancePayment Model. While creating object in this model i also want to save data in CollectionCenterLedger Model.But while doing this the data is not getting saved in that model. Why the following part is not working?

ledger = package_models.CollectionCenterLedger(
    ledger_type="credit",
    amount=amount,
    center_id=center,
    remarks="Advanced Amount by Center"
).save()

What is wrong i am doing here? I'm new in Django Rest Framework. Any help would be really appreciated. Thank you !!

CollectionCenterLedger Model:

class CollectionCenterLedger(core_models.TimestampedModel):
TYPE = (
    ("debit", "debit"),
    ("credit", "credit"),
)
STATUS = (
    ("completed", "Completed"),
    ("canceled", "Canceled"),
    ("deleted", "deleted"),
    ("hold", "hold"),
)
center = models.ForeignKey(center_models.Centers, on_delete=models.CASCADE)
booking = models.ForeignKey('booking.Booking', on_delete=models.CASCADE, null=True, blank=True)
add_booking = models.ForeignKey('booking.AdditionalMemberBooking', on_delete=models.CASCADE,related_name='add_booking_ledger', null=True, blank=True)
amount = models.FloatField(null=True, blank=True, default=0)
package = models.ForeignKey(Package,on_delete=models.CASCADE,null=True, blank=True,related_name='order_package')
rcl_share = models.FloatField(null=True, blank=True)
client_discount_percentage = models.CharField(max_length=50,null=True, blank=True)
client_share = models.FloatField(null=True, blank=True)
center_rem_balance = models.FloatField(null=True, blank=True)
ledger_type = models.CharField(max_length=20, choices=TYPE)
ledger_date = models.DateTimeField(auto_now_add=True)
remarks = models.CharField(max_length=200, null=True, blank=True)
status = models.CharField(max_length=20, choices=STATUS, default="completed")

Upvotes: 0

Views: 28

Answers (1)

NixonSparrow
NixonSparrow

Reputation: 6378

You cannot assign variable to save() function, because it does not return the object. Try changing it to that:

ledger = package_models.CollectionCenterLedger(
    ledger_type="credit",
    amount=amount,
    center_id=center,
    remarks="Advanced Amount by Center"
)
ledger.save()

Also, this is going to get you tuple with object and info if it was created, not QuerySet, you can't call first() in here, you should change it to [0] to get object.

center=center_models.Centers.objects.get_or_create(id=center).first()  # bad

center=center_models.Centers.objects.get_or_create(id=center)[0]       # good

It's strange you didn't get an error from it.

Upvotes: 1

Related Questions