Обновить данные поддельной модели ключей в Django - PullRequest
0 голосов
/ 23 февраля 2019

У меня есть две модели

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'

Я хочу обновить 'collectionTime' модели CollectedSample, связанной с 'labereportId'

Мой текущий запрос:

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

Но я получаю эту ошибку.

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

Пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Следующие работы:

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}")

Prints:

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

Это следует за отношением ForeignKey в обратном порядке, как объяснено в официальных документах здесь .

0 голосов
/ 23 февраля 2019

Да, собрано. SampleId - это внешний ключ, поэтому вы должны использовать select_related

LabReportRelation.objects.filter(labReportId__in=labReportIdList)
     .select_related('collectedSampleId')
     .update(
        collectedSampleId__collectionTime=updateTime
     )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...