Поля модели Django определены на уровне класса? - PullRequest
1 голос
/ 09 октября 2010

Может быть, мой вопрос немного по-детски. Модель Django обычно определяется следующим образом:

class DummyModel(models.Model):
    field1 = models.CharField()
    field2 = models.CharField()

Насколько я понимаю, field1 и field2 определены на уровне класса, а не на уровне экземпляра. Таким образом, разные экземпляры будут использовать одно и то же значение поля. Как это возможно, учитывая, что веб-приложение должно быть многопоточным? Я что-то упустил в своей кривой изучения Python?

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

Вы правы, что обычно атрибуты, объявленные на уровне класса, будут совместно использоваться экземплярами. Однако Django использует некоторый умный код, включающий метаклассы, чтобы каждый экземпляр имел разные значения. Если вам интересно, как это возможно, у книги Марти Алчина Pro Django есть хорошее объяснение - или вы можете просто прочитать код.

0 голосов
/ 11 октября 2010

Думайте о моделях, которые вы определяете как технические характеристики. Вы указываете нужные поля, и когда Django возвращает вам экземпляр, он использует ваши спецификации для создания совершенно другого объекта, который выглядит одинаково.

Например,

field1 = models.CharField()

Когда вы присваиваете значение field1, например «Я поле», не кажется ли вам странным, что вы можете присвоить строку полю, которое должно быть «CharField»? Но когда вы сохраняете этот экземпляр, все по-прежнему работает?

Django смотрит на CharField, говорит: «Это должна быть строка» и передает ее вам. Когда вы сохраняете его, Django проверяет значение по заданной вами спецификации и сохраняет его, если оно действительно.

Конечно, это очень упрощенное представление, но оно должно подчеркивать разницу между определением модели и фактическим экземпляром, с которым вы можете работать.

...