Я использую Django
и DRF
для согласования двух списков данных (обещания платить и платежи). При загрузке новых платежей, если идентификатор платежной транзакции совпадает с идентификатором обещания оплаты, я хочу связать их, сохранив соответствующее обещание в поле внешнего ключа платежа.
У меня две модели :
class Promise(models.Model):
transaction_id = models.CharField(max_length=50)
amount_promised = models.DecimalField(decimal_places=2, max_digits=8)
created_on = models.DateTimeField(auto_now_add=True)
class Payment(models.Model):
promise = models.OneToOneField(Promise, on_delete=models.CASCADE, blank=True)
transaction_id = models.CharField(max_length=50)
amount_paid = models.DecimalField(decimal_places=2, max_digits=8)
created_on = models.DateTimeField(auto_now_add=True)
и два представления:
class PromiseViewSet(viewsets.ModelViewSet):
permission_classes = (IsCreatorOrReadOnly,)
queryset = Promise.objects.all()
serializer_class = PromiseSerializer
class PaymentViewSet(viewsets.ModelViewSet):
permission_classes = (IsCreatorOrReadOnly,)
queryset = Payment.objects.all()
serializer_class = PaymentSerializer
Насколько я понимаю, для этого требуется специальный метод сохранения, но я не уверен, что magi c должно происходить в представлениях или моделях. В любом случае, logi c должен выглядеть примерно так:
- L oop через обещания ... если новый payment.transaction_id = a promise.transaction_id, разорвите и свяжите два вместе, сохранив обещание.pk во внешнем ключе обещания во вновь созданном платежном объекте.
Вот мои обновленные мысли о потенциальном решении:
class PaymentViewSet(viewsets.ModelViewSet):
permission_classes = (IsCreatorOrReadOnly,)
queryset = Payment.objects.all()
serializer_class = PaymentSerializer
def perform_create(self, serializer):
queryset = Promise.objects.filter(transaction_id=self.transaction_id)
if queryset.exists():
return queryset.pk
serializer.save(queryset.pk=self.promise)