Django REST Framework创建对象报错及Inspection字段赋值异常求助
问题分析与解决方案
核心问题原因
get() returned more than one Request报错:
你用Request.objects.get(reqdescription=instance.reqdescription)查询时,reqdescription字段没有唯一约束,数据库中存在多条相同描述的Request记录,而get()方法要求必须返回且仅返回一条记录,因此抛出异常。description显示
Request object (36):
你将Request.objects.get(...)返回的Request对象直接赋值给了Inspection的description字段,而非提取该对象的reqdescription属性值,Django在显示对象时默认输出这种字符串格式。多余的查询操作:
Request.objects.get(reqid=instance.reqid)完全没必要——instance本身就是刚创建的Request实例,直接使用即可,重复查询既冗余又可能引发并发问题。
修正后的signals.py代码
from django.db.models.signals import post_save from django.dispatch import receiver from .models import Request, Inspection from datetime import datetime @receiver(post_save, sender=Request) def create_transaction_log(sender, instance, created, **kwargs): if created: Inspection.objects.create( reqid=instance, # 直接使用刚创建的Request实例 description=instance.reqdescription, # 提取实例的描述属性 reqdate=datetime.now().date() # 直接传入Date对象,无需转字符串(若模型reqdate是DateField) )
模型层检查(models.py)
确保Inspection的reqid字段是OneToOneField关联Request(这是你怀疑的点,确实需要确认):
from django.db import models class Request(models.Model): reqdescription = models.CharField(max_length=255) techofficeid = models.CharField(max_length=50) # 其他字段... class Inspection(models.Model): reqid = models.OneToOneField(Request, on_delete=models.CASCADE) description = models.CharField(max_length=255) reqdate = models.DateField() # 其他字段...
额外提示
- 如果
reqdate字段在模型中定义为DateField,直接用datetime.now().date()传入即可,无需转成字符串,Django会自动处理格式。 - 若需要保证
reqdescription的唯一性,可以在Request模型的该字段上添加unique=True约束,但根据业务场景判断是否必要。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

