You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django创建Product后自动创建关联Price失败问题求助

解决方案

方法一:修正perform_create方法

你不需要重新查询数据库获取刚创建的Product实例,serializer.save()本身就会返回保存后的对象,直接用这个对象创建Price即可:

class ProductView(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    ordering = ["code"]

    def perform_create(self, serializer):
        # 获取刚创建的Product实例
        product = serializer.save()
        # 用该实例创建对应的Price记录
        Price.objects.create(code=product)

方法二:使用Django信号(更通用)

如果希望无论通过什么方式创建Product都能自动生成对应的Price,推荐使用Django的post_save信号,这样不需要在视图里写逻辑,更符合解耦原则:

在models.py中添加以下代码:

from django.db.models.signals import post_save
from django.dispatch import receiver

# 监听Product的保存信号,创建对应的Price
@receiver(post_save, sender=Product)
def auto_create_price(sender, instance, created, **kwargs):
    # 仅当Product是新创建时才执行
    if created:
        Price.objects.create(code=instance)

原有代码问题说明

你之前通过Product.objects.get(code=self.request.data["code"])查询的方式存在两个隐患:

  1. 若请求数据中的code被篡改(比如前端传错),会直接抛出DoesNotExist异常
  2. 重复查询数据库完全没必要——serializer.save()已经返回了刚创建的实例,直接复用更高效可靠

内容的提问来源于stack exchange,提问作者Moun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 08:37:27