首页 > 解决方案 > 如果它们之间存在匹配值,如何将保存在 django 中的对象链接到现有对象?

问题描述

我正在使用DjangoDRF协调两个数据列表(付款承诺和付款)。上传新付款时,如果付款交易 ID 与付款承诺共享相同 ID,我想通过在付款的外键字段中保存相应的承诺来链接它们。

我有两个模型:

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

我的理解是这需要自定义保存方法,但我不确定是否应该在视图或模型中发生魔法。无论哪种方式,逻辑应该是这样的:

以下是我对潜在解决方案的最新想法:

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)

标签: djangodjango-rest-frameworkdjango-class-based-views

解决方案


我认为在这里使用 django.db.models.signals.post_save 可以是一个选项。


推荐阅读