理解 Django 模型类的定义
Posted
技术标签:
【中文标题】理解 Django 模型类的定义【英文标题】:Understanding definition of Django's model class 【发布时间】:2021-03-18 00:01:00 【问题描述】:如果我们如下创建一个新模型,
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 代码方面有点吃力 在类定义中,就我如何理解类的工作而言,并希望有人能提供帮助 我对以下问题的理解:
在类 Book 的定义中,title 似乎是一个 类属性。此类属性设置为 CharField 类?在这种情况下,当我们创建一个实例时 Book 类,如果我们不传入参数,将标题 是否设置为同一个 CharField 实例?
当我们在创建这个 Book 实例时传入 title='Matilda' 时,这是否会覆盖属性 title?
我们如何知道 Book 将标题作为参数?
我希望这些有意义。感谢您的任何帮助。 莉齐
【问题讨论】:
嗯,你是从django.db.models.Model
子类化的,这是一个复杂的类(参见来源:github.com/django/django/blob/master/django/db/models/…)。它旨在使用户体验易于定义您的模型以及如何使用它们。如果您想深入了解内部结构,无论如何都可以。
"在这种情况下,当我们创建 Book 类的实例时,如果我们不传入参数,标题会被设置为同一个 CharField 实例吗?" .不,Django 使用元类,并覆盖 __get__
和 __set__
python 描述符。
【参考方案1】:
当您在 Django 中创建模型类时,将该类视为数据表,将该类的每个单独实例视为表行,将每个表的属性(例如:标题)视为列。
在类Book 的定义中,title 似乎是一个类属性。这个类属性设置为 CharField 类的一个实例?在这种情况下,当我们创建 Book 类的实例时,如果我们不传入参数,title 会被设置为 CharField 的同一个实例吗?
‘title’是数据表中的一个字段,‘CharField’是一个字段类型;您使用“CharField”、“TexrField”等类为每个字段分配一个类型。如果您在描述类型,示例:
title = models.CharField(max_length=50, default=‘unknown’)
当我们在创建这个 Book 实例时传入 title='Matilda' 时,这是否会覆盖属性 title?
你给它一个值'Matilda',因为它没有标题,直到你给它一个(或在制作字段时提供一个默认值)。
我们如何知道 Book 将标题作为参数?
因为你是在模型类中写的;这真的取决于你将如何输入数据。如果您正在制作某种从用户那里获取输入的页面,请在表单中显示“标题”字段并使其成为必填项。您可以在分配字段类型时将字段设为可选,例如
title = models.CharField(max_length=200, null=true, blank=true)
【讨论】:
以上是关于理解 Django 模型类的定义的主要内容,如果未能解决你的问题,请参考以下文章
带有来自模型的自定义验证消息的 Django 1.5 基于类的视图