Понимание определения класса модели Django

#python #django #django-models #python-class

#python #джанго #django-модели #python-class

Вопрос:

Если мы создадим новую модель следующим образом,

 from django.db import models   

class Book(models.Model): 
  title = models.CharField(max_length=200)
  author = models.CharField(max_length=200)
 

и запустите миграцию базы данных, тогда я понимаю, что
соответствующая таблица создается с именами столбцов и типами полей, и я понимаю, что мы можем сделать следующее:

 >>> from myapp.models import Book
>>> book = Book(title="Matilda", author="Roald Dahl")
>>> book.save()
>>> print book.title
Matilda
 

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

  1. В определении классной книги заголовок, по-видимому, является атрибутом класса. Этот атрибут класса установлен для экземпляра класса CharField? В каком случае, когда мы создаем экземпляр класса Book, если мы не передадим аргумент, будет ли title присвоен этому же экземпляру CharField ?
  2. Когда мы передаем title= ‘Matilda’ при создании этого экземпляра Book , переопределяет ли это заголовок атрибута?
  3. Откуда мы знаем, что книга принимает название в качестве аргумента?

Я надеюсь, что это имеет смысл. Спасибо вам за любую помощь. Лиззи

Комментарии:

1. Ну, вы подклассируете из django.db.models.Model , который является сложным классом (см. Источник: github.com/django/django/blob/master/django/db/models /… ). Он направлен на то, чтобы упростить пользователю определение ваших моделей и способов их использования. Если вы хотите глубоко погрузиться во внутренние компоненты, вы можете это сделать всеми возможными способами.

2. » В каком случае, когда мы создаем экземпляр класса Book, если мы не передадим аргумент, будет ли title присвоен этому же экземпляру CharField? «. Нет, Django использует метакласс и переопределяет __get__ __set__ дескрипторы и python.

Ответ №1:

Когда вы создаете класс модели в Django, считайте этот класс таблицей данных, каждый отдельный экземпляр этого класса — строками таблицы, а атрибуты (например, заголовок) каждой таблицы — столбцами.

В определении классной книги заголовок, по-видимому, является атрибутом класса. Этот атрибут класса установлен для экземпляра класса CharField? В каком случае, когда мы создаем экземпляр класса Book, если мы не передадим аргумент, будет ли title присвоен этому же экземпляру CharField ?

‘title’ будет полем в таблице данных, а ‘CharField’ будет типом поля; каждому полю присваивается тип с помощью таких классов, как ‘CharField’, ‘TexrField’ и т. Д. Вам не обязательно передавать значение для ‘title’ (или любого другого поля), если вы указываете значение по умолчанию при описании типа, например:

 title = models.CharField(max_length=50, default=‘unknown’)
 

Когда мы передаем title= ‘Matilda’ при создании этого экземпляра Book , переопределяет ли это заголовок атрибута?

Вы присваиваете ему значение ‘Matilda’, поскольку у него нет заголовка, пока вы его не присвоите (или не укажите значение по умолчанию при создании поля).

Откуда мы знаем, что книга принимает название в качестве аргумента?

Потому что вы написали это в классе модели; это действительно зависит от того, как вы собираетесь вводить данные на самом деле. Если вы создаете какую-то страницу, которая принимает входные данные от пользователя, отобразите поле ‘заголовок’ в форме и сделайте его обязательным. Вы можете сделать поля необязательными при назначении типа поля, например

 title = models.CharField(max_length=200, null=true, blank=true)