Django: объект модели может сохранить значение даже в неопределенном поле? - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть Symbol модель:

class Symbol(models.Model):

    market = models.CharField(         
        max_length=20,
        null=True,
        blank=True,
    )

и сгенерировать некоторые Symbol данные модели.

Что меня удивило:

>>> s = Symbol.objects.first()
>>> s.i_dont_know = 1
>>> s.save()

Ошибка не возникает?

Почему не возникает никаких ошибок?

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Почему не возникает никаких ошибок?

На Model вы можете определить ноль или более полей, которые имеют эквивалент в базе данных, но помимо этого вы также можете добавить ноль или более функций, свойств, атрибутов и т. Д. В модель.

Вы, наверное, уже как-то это сделали. Например:

class Symbol(models.Model):

    market = models.CharField(         
        max_length=20,
        null=True,
        blank=True,
    )

    def __init__(self, *args, **kwargs):
        super(Symbol, self).__init__(*args, **kwargs)
        <b>self.cache = {}</b>

    <b>@property
    def market3(self):
        return self.market and self.market[:3]</b>

После того, как все эти модели на самом деле являются объектами Python, с некоторой магией, такой, что если вы измените атрибут и появится поле с тем же именем, то оно будет соответствовать этому полю. Но обычно модели также имеют некоторую дополнительную логику и атрибуты, чтобы сделать их более интеллектуальными, обрабатывать части запроса на уровне модели, вычислять свойства, которые зависят от одного или нескольких полей и т. Д.

Письмо:

<b>s.i_dont_know = 1</b>

Вы прикрепили атрибут к s объекту с именем 'i_dont_know' и значением 1. Однако обратите внимание, что этот атрибут не постоянный: если вы сохраните объект, а затем перезагрузите его из базы данных, то все дополнительные данные, которые вы к нему прикрепили, исчезнут. Если, конечно, вы не определите сеттер, который добавляет дополнительную логику.

0 голосов
/ 30 апреля 2018

Когда вы вызываете метод save для объекта модели, он будет обновлять только те поля модели, которые мы определили в модели. Все остальные атрибуты модельного объекта будут игнорироваться. Вот почему вы не получили никаких ошибок.

...