#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
в определении класса, просто с точки зрения того, как я понял, как работают классы, и надеялся, что кто-нибудь сможет помочь
моему пониманию со следующими вопросами:
- В определении классной книги заголовок, по-видимому, является атрибутом класса. Этот атрибут класса установлен для экземпляра класса CharField? В каком случае, когда мы создаем экземпляр класса Book, если мы не передадим аргумент, будет ли title присвоен этому же экземпляру CharField ?
- Когда мы передаем title= ‘Matilda’ при создании этого экземпляра Book , переопределяет ли это заголовок атрибута?
- Откуда мы знаем, что книга принимает название в качестве аргумента?
Я надеюсь, что это имеет смысл. Спасибо вам за любую помощь. Лиззи
Комментарии:
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)