Почему атрибут устанавливается, но не сохраняется - PullRequest
0 голосов
/ 28 марта 2019

Я пытаюсь динамически добавить атрибут во время выполнения, используя следующие фрагменты кода:

Представление

...
for appellation in queryset:
  if appellation.id in used_id_set:
    appellation.is_used_flag()
    print(appellation.is_used)
    # prints true as expected
  else:
    appellation.is_not_used_flag()

  first = queryset.first()
  print(first.is_used)
  # prints AttributeError: 'Appellation' object has no attribute 'is_used'

В модели

...
def is_used_flag(self):
  self.is_used = True
def is_not_used_flag(self):
  self.is_used = False

Почемуон работает правильно, когда в цикле, но когда я пытаюсь получить атрибут из экземпляра после того, как он не работает?Я столкнулся с той же проблемой, используя setattr, appellation.is_used = True и изменив __dict__.Также есть ли лучший способ сделать это?

Я ссылался на эти сообщения:
Почему вы не можете добавить атрибуты к объекту в python? У меня есть dict, но он, кажется, не сохраняется после цикла

Как назначить новый атрибут класса с помощью __dict __? Та же проблема, что и упомянутая выше

Динамическое определение полей экземпляра в классах Python То же, что и выше

Обновление

Поскольку в обоих ответах упоминаются сходные вещи, я должен уточнить, каковы мои намерения.Я не хочу на самом деле сохранить значение в БД.Я просто хочу сериализовать его и использовать в начале.

Ответы [ 2 ]

1 голос
/ 28 марта 2019

API Queryset в django (часто) возвращает другие наборы запросов, которые в свою очередь оцениваются при обращении к базе данных.Делая queryset.first(), вы выполняете другой вызов базы данных, где ваши атрибуты еще не были установлены.

Если вам нужно сохранить этот флаг is_used между наборами запросов ( persist , изменение), Я предлагаю вам добавить BooleanField в вашу модель или, возможно, найти другой способ сделать то, что вы хотите, поскольку атрибуты памяти не будут возвращены с помощью API набора запросов.

0 голосов
/ 28 марта 2019

Если вы хотите, чтобы изменение сохранялось, вам нужно будет позвонить self.save() после установки is_used, предполагая, что is_used - это поле в Appellation модели.

models.py

from django.db import models

class Appellation(models.Model):
    # ... rest of code ...

    is_used = models.BooleanField(default=False)

    def is_used_flag(self):
        self.is_used = True
        self.save()

    def is_not_used_flag(self):
        self.is_used = False
        self.save()

Обратите внимание, что экземпляры Django по-прежнему являются объектами Python, поэтому динамическое добавление атрибута будет работать точно так же, поэтому он печатает True, как и ожидалось в предоставленном вами коде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...