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

Django REST Framework创建对象报错及Inspection字段赋值异常求助

问题分析与解决方案

核心问题原因

  1. get() returned more than one Request报错:
    你用Request.objects.get(reqdescription=instance.reqdescription)查询时,reqdescription字段没有唯一约束,数据库中存在多条相同描述的Request记录,而get()方法要求必须返回且仅返回一条记录,因此抛出异常。

  2. description显示Request object (36):
    你将Request.objects.get(...)返回的Request对象直接赋值给了Inspection的description字段,而非提取该对象的reqdescription属性值,Django在显示对象时默认输出这种字符串格式。

  3. 多余的查询操作:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 20:40:10