djang密钥模型的数据更新

2024-05-13 21:17:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个模型

class LabReportRelation(models.Model):
    labReportId = models.AutoField(primary_key=True)
    collectedSampleId = models.ForeignKey(CollectedSample, null=True)
    ....
    ....
    class Meta:
        db_table = 'labReportRelation'

class CollectedSample(models.Model):
    id = models.AutoField(primary_key=True, max_length=5)
    collectionTime = models.DateTimeField()
    ....
    ....
    class Meta:
        db_table = 'collectedSample'

我想更新CollectedSample模型中与“laberReportId”相关的“collectionTime”

我当前的查询是:

LabReportRelation.objects.filter(labReportId__in=labReportIdList)
         .prefetch_related('collectedSampleId')
         .update(
            collectedSampleId_collectionTime=updateTime
         )

但我得到了这个错误

FieldDoesNotExist(u"labReportRelation has no field named 'collectedSampleId_collectionTime'",)

请帮帮我


Tags: key模型truedbmodelmodelsmetaclass
2条回答

以下工作:

CollectedSample.objects.filter(labreportrelation__labReportId__in=labReportIdList).update(collectionTime=updateTime)

假设labReportIdList是一个列表

运行以下模型(与OP中的模型完全相同):

import os

_module = os.path.split(os.path.dirname(__file__))[-1]
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "{}.settings".format(_module))
import django

django.setup()
from app.models import CollectedSample, LabReportRelation
from django.utils.timezone import now


if __name__ == "__main__":
    sample = CollectedSample.objects.create(collectionTime=now())
    report = LabReportRelation.objects.create(collectedSampleId=sample)
    print(f"Initial collection time: {sample.collectionTime} for sample {sample.id}")
    labReportIdList = [report.labReportId]
    updateTime = now()
    CollectedSample.objects.filter(labreportrelation__labReportId__in=labReportIdList).update(collectionTime=updateTime)
    sample = CollectedSample.objects.get(pk=sample.pk)
    print(f"Updated collection time: {sample.collectionTime} for sample {sample.id}")

印刷品:

Initial collection time: 2019-02-23 07:51:10.578433+00:00 for sample 3
Updated collection time: 2019-02-23 07:51:10.735463+00:00 for sample 3

正如官方文件here所解释的,它向后遵循ForeignKey关系

哦,收集到了sampleid是外键,所以你应该使用select_related

LabReportRelation.objects.filter(labReportId__in=labReportIdList)
     .select_related('collectedSampleId')
     .update(
        collectedSampleId__collectionTime=updateTime
     )

相关问题 更多 >