Как связать объект при сохранении в django с существующим, если между ними есть совпадающее значение? - PullRequest
1 голос
/ 20 июня 2020

Я использую 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)

1 Ответ

0 голосов
/ 20 июня 2020

Думаю, здесь можно использовать django .db.models.signals.post_save.

...