Обновить данные модели чужого ключа в django

у меня двойная модель

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'",)

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
34
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

О, получилось, collectSampleId - это внешний ключ, поэтому вы должны использовать select_related

LabReportRelation.objects.filter(labReportId__in=labReportIdList)
     .select_related('collectedSampleId')
     .update(
        collectedSampleId__collectionTime=updateTime
     )
FieldDoesNotExist(u"labReportRelation has no field named 'collectedSampleId__collectionTime'",) Получаю ту же ошибку, что и пробовал.
GAJESH PANIGRAHI 23.02.2019 08:01
lab_report вернет список LabReportRelation, поэтому мы не можем напрямую обновлять, как lab_report.collectedSampleId..................
GAJESH PANIGRAHI 23.02.2019 08:17

@GAJESHPANIGRAHI, вам следует использовать select_related, я обновил ответ.

HariHaraSudhan 23.02.2019 08:19

мое плохое использование этого collectedSampleId__collectionTime=updateTime

HariHaraSudhan 23.02.2019 08:25

Я пробовал, но все равно получаю ту же ошибку. Я думаю, что мы что-то упускаем.

GAJESH PANIGRAHI 23.02.2019 08:30
Ответ принят как подходящий

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

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

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

Другие вопросы по теме