django - 如果它们之间存在匹配值,如何将保存在 django 中的对象链接到现有对象?
问题描述
我正在使用Django
并DRF
协调两个数据列表(付款承诺和付款)。上传新付款时,如果付款交易 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
我的理解是这需要自定义保存方法,但我不确定是否应该在视图或模型中发生魔法。无论哪种方式,逻辑应该是这样的:
- 遍历 promises...如果新的 payment.transaction_id = a promise.transaction_id,通过将 promise.pk 保存到新创建的支付对象中的 promise 外键来打破并链接两者。
以下是我对潜在解决方案的最新想法:
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)
解决方案
我认为在这里使用 django.db.models.signals.post_save 可以是一个选项。
推荐阅读
- c++ - 重载 std::tuple 的类型转换运算符
- python - 在过滤的查询集中获取重复的记录
- python-2.7 - Nifi:如何将 ExecuteStreamCommand 输出嵌入到 PutEmail 消息
- php - 如何在 PHP 中将选择数据保存为逗号分隔值
- mapping - 我如何从 gensim 的 translation_matrix 中获取向量
- java - (Android Studio) 我的井字游戏因 (java.lang.IllegalStateException: Could not execute method for android:onClick) 错误而崩溃
- java - 使用 MongoOperation 在 Spring Data MongoDB 中构建 ArrayFilters 更新
- firebase - 无法在颤动中收听来自实时数据库(RTDB)的传入数据
- regex - Perl 读取 CSV 并操作日期和数字
- python - 如何以这种方式过滤数据框?