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"])查询的方式存在两个隐患:
- 若请求数据中的
code被篡改(比如前端传错),会直接抛出DoesNotExist异常 - 重复查询数据库完全没必要——
serializer.save()已经返回了刚创建的实例,直接复用更高效可靠
内容的提问来源于stack exchange,提问作者Moun
相关产品推荐
相关产品推荐

