geekdoc-python-zh/docs/askpython/django-models.md

10 KiB
Raw Permalink Blame History

Django 模型——完全的初学者指南

原文:https://www.askpython.com/django/django-models

Django 模型是表示数据库中的一个表或集合的类。它包含关于表的所有信息。这些模型一起存储在 Django 的一个文件 models.py 中,该文件位于我们的 Django 应用程序中。

不同的数据库可能有许多不同的模型,包含不同的信息,如用户数据库、图书数据库或 web 应用程序所需的任何其他表。

Django 模型的基本结构

class Modelname(models.Model):
	'''A class representing a model derived from Model class'''
    #Fields
    Field_name = models.CharField(max_length = , hepl_text = , choices = , Null etc)

    #Metadata
    class Meta:
        Ordering = [field_name]

    #Methods
    def __str__(self):
	    return '<readable_name>'

1.模型中的字段

一个特定的模型可以有任意数量的字段,这些字段代表数据库表的各种属性。

可以有许多不同类型的字段

  • 卡菲尔德
  • 积分值
  • 电子邮件

这些字段还可以接受如下参数

  1. max _ length–可能的最大字符数。
  2. 主键–这告诉 Django 这个字段对于所有条目都是唯一的。
  3. 外键–用于连接一个模型和另一个模型。
  4. NULL-如果为真,将空字段转换为空值, char 字段将它们作为空字符串
  5. 选择–如果字段必须是给定选项中的一个(如选项框)
  6. 空白–如果为真,该字段可以允许为空,否则必须填写。

2.模型元数据

该元数据具有各种特征;其中最重要的是排序。当您发出请求时,它允许您在数据库中以特定的顺序显示响应。

语法如下

ordering ['<Name>']

这告诉模型按照 <名称> 的顺序排列 DB 中的元素,即如果 <名称>CharField 则可以是字母顺序,或者如果其是跨域则可以是数字升序顺序等等。

如果语法与 "-" 符号一起使用,这意味着排序应该是相反的顺序

ordering [-'<name>']

3.Django 模型中的方法

这些用于更好的客户端界面,也就是更好的呈现等。

例如, str 告诉您在管理站点中为数据库中的每个特定元素显示什么**(像一个简称)**。(而不是显示全部信息)

现在让我们制作一个图书项目,包含以下信息:

  • 一个包含所有书籍信息的主页
  • 包含每本书信息的网页。(我们在 Django URL 映射 ) 中看到

为此,使用前几篇文章中获得的知识制作一个名为 books 的应用程序。

1.创建我们的第一个 Django 模型

在 books/models.py 中,让我们创建一个模型 DB将标题、价格和流派作为属性并对标题进行元数据排序。

BookModel

BookModel

现在我们需要在数据库中创建这个表。默认情况下Django 使用 SQLite 数据库引擎。现在,我们将使用这个数据库本身。

你可以从数据库下的 settings.py 文件中查看你正在使用的数据库

settings.py

Settings.py

2.在数据库中创建表

为了首先创建表,我们需要应用迁移。在 shell 中编写下面的代码

python manage.py migrate
python manage.py makemigrations <app_name>
Python manage.py sqlmigrate <app_name> 0001

再次运行:

Python manage.py migrate

输出将表明数据库创建成功。

您的模型表已经在 **SQLite 中准备好了。**注意每当我们对模型进行更改时,我们需要重复上述的步骤,以便对数据库中的表格进行更改。

现在,我们将学习获取/添加数据到数据库

从数据库中检索信息

现在,首先我们需要在目录中打开 python shell使用命令:

python manage.py shell

因此,现在我们将让 python 控制台出现在 shell 中。我们需要导入模型表,以便从中添加/检索信息。

导入表的语法是:

from <app_name>.models import <model_name>

我的情况是这样的

Python Shell

Python Shell

1.从一个表中获取所有对象

为此,我们使用以下语法

<model_name>.objects.all()

因此,我的代码将是:

BookModel.objects.all()

2.将信息添加到表格中

为了添加信息,语法类似于面向对象的 python 语法。这里,我们首先创建一个具有模型名称的类对象,然后添加所需的属性。

创建一个对象,语法是:

A = <model_name>()

举例:

A.Title = "Harry Potter"
A.Price = 120
A.Genre = "Fantasy Fiction" 
A.save()

这样我们就输入了第一本书的信息。同样的,我再补充几个。

Addition To DB

Addition To DB

3.从数据库中过滤记录

为了过滤 Django 模型数据库中的记录,我们运行:

<Model_name>.objects.filter(Title =<Title_Element>)

因此,举例来说,如果我过滤掉所有类型的书籍,比如小说,那么

Filter

Filter

4.获取元素的完整信息

**注意:**当我们使用过滤器时,我们以简短的形式获得元素(以一种由 def str 描述的方式),但是如果我们想要关于一个元素的完整信息,我们使用这个方法

<model_name>.objects.get(Title = <"title_element">)

在这里我们可以得到包括标题在内的所有信息。价格,流派。

这就是我们使用 T1 的时候

a = BookModel.objects.get(title = "Ghostbuster")

然后所有的信息都被存储为一个对象,所以如果我们实现了下面的代码,它就会打印出相应的值。

a.title()
a.price()
a.genre()

5.从数据库中删除行元素

为了删除一个特定的元素,我们使用语法**。删除()**

from books.models import BookModel
a =BookModel.objects.get(title="<book_name">)
a.delete()

通过 views.py 连接到模型数据库

现在我们将学习如何从数据库获取信息,然后在我们的网页上显示它。

Views.py 中添加代码:

def BookView(request):
    books = BookModel.objects.all()

    html = ''
    for book in books:
        var = f'<li> {book.title} </li><br>'
        html = html + var
    return HttpResponse(html,status = 200)

现在从代码中,你可以理解我们基本上把所有的数据库信息检索到变量 books 中,然后我们开始一个循环,从数据库中获取每个元素,并在网页上显示为 HTML。

我们还必须为这个视图提供端点( Books/ )。根据从 Django-URL 映射文章中获得的知识,自己尝试一下

URL mapping

URL mapping

现在为网页**(书籍/ <标题 _ 名称> )** 。看看下面的代码可以更好的理解。

BookIDView

BookIDView

代码很简单;我们只是使用 Get 获取关于 book_name 的所有信息,然后在网页上显示为 HTML

这里,我们从数据库中检索了特定的信息,然后将其显示在 Web 页面上。让我们看看这个视图中的 urls.py 文件是什么样子的。

URL mapping - BookIDView

URL mapping BookIDView

现在我们将运行服务器,看看它是否工作

Runserver

Runserver

书籍/ 网页的浏览器页面

Browserbooks 1024x583 1

Browser (books/)

书籍/ <书名 _ 名称> 网页的浏览器页面

Browser Ghostbuster

Browser (books/Ghostbuster)

BrowserHarry Potter 1024x583 1

Browser (books/Harry Potter)

使用外键连接到其他型号

一个外键 (FK)用于链接两个使用一些公共信息的数据库。这有助于保持我们的数据库整洁,也确保我们不必一次又一次地输入相同的信息。

现在,在我们的图书应用程序中,让我们制作一个作者模型表,并在图书模型中添加 Author_id 字段。现在注意几本书可能有相同的作者,所以 Author_id 将作为我们的 BookModel 中的外键。

使用 FK我们可以搜索特定作者写的各种书籍。此外如果作者删除了他的帐户那么他的所有书籍也将被自动删除从而减少了从 BookModel 中手动删除它们的工作。

开始时你可能会有点困惑,但经过反复练习,它会开始变得有意义。所以不用担心!!

AuthorModel

AuthorModel

现在我们可以在 BookModel 中添加 Author 字段。

Authorfield django models

Author_id Field

我们必须为新的 AuthorModel 运行迁移。还要注意:由于我们改变了我们的 BookModel DB我们必须运行前面提到的外壳代码**(迁移)**。

Migrations

Migrations

我们在数据库中已经有了一些没有作者字段的信息。所以 Django 要求在 author_id 字段中为他们输入一个默认值

最好在使用应用迁移(改变表格)之前删除所有早期的元素。删除()

我们现在可以像添加图书信息一样向 Author DB 添加信息。

Author DB

Author DB

同样作为练习,试着自己创建一个类似于图书视图的作者视图

我们现在已经学会了通过 shell 向表中输入数据,但这并不是添加数据的最有效方式。最简单的方法是通过管理站点添加数据。我们将在下一篇文章中学习如何做到这一点。

同样从管理网站,你会得到更多关于这整个 FK 的工作信息,以及作者数据库和模型数据库如何通过 FK 相互链接。

结论

就这样,我们已经到了文章的结尾。在下一篇文章中,我们将学习管理站点接口,然后以一种更好的方式看到 FK 的效用。继续编码!!