【问题标题】:Understanding definition of Django's model class理解 Django 模型类的定义
【发布时间】: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 代码方面有点吃力 在类定义中,就我如何理解类的工作而言,并希望有人能提供帮助 我对以下问题的理解:

  1. 在类 Book 的定义中,title 似乎是一个 类属性。此类属性设置为 CharField 类?在这种情况下,当我们创建一个实例时 Book 类,如果我们不传入参数,将标题 是否设置为同一个 CharField 实例?

  2. 当我们在创建这个 Book 实例时传入 title='Matilda' 时,这是否会覆盖属性 title?

  3. 我们如何知道 Book 将标题作为参数?

我希望这些有意义。感谢您的任何帮助。 莉齐

【问题讨论】:

  • 嗯,你是从django.db.models.Model 子类化的,这是一个复杂的类(参见来源:github.com/django/django/blob/master/django/db/models/…)。它旨在使用户体验易于定义您的模型以及如何使用它们。如果您想深入了解内部结构,无论如何都可以。
  • "在这种情况下,当我们创建 Book 类的实例时,如果我们不传入参数,标题会被设置为同一个 CharField 实例吗?" .不,Django 使用元类,并覆盖 __get____set__ python 描述符。

标签: python django django-models python-class


【解决方案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)

【讨论】:

    猜你喜欢
    • 2013-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多