Django后端开发学习笔记使用Models并在Django自带管理页面中管理数据
Posted 梆子井欢喜坨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django后端开发学习笔记使用Models并在Django自带管理页面中管理数据相关的知识,希望对你有一定的参考价值。
参考资料:
MDN: Django Tutorial Part 3: 使用模型
MDN: Django Tutorial Part 4: Django 管理员站点
django文档: models/fields
1. 定义模型
Django 遵循 DRY Principle 。它的目标是你只需要定义数据模型,然后其它的杂七杂八代码你都不用关心,它们会自动从模型生成。
模型通常在应用程序的models.py文件中定义。 它们被实现为django.db.models.Model的子类,并且可以包括字段,方法和元数据。
下面的代码片段显示了一个名为MyModelName的“典型”模型:
from django.db import models
class MyModelName(models.Model):
"""
A typical class defining a model, derived from the Model class.
"""
# Fields
my_field_name = models.CharField(max_length=20, help_text="Enter field documentation")
...
# Metadata
class Meta:
ordering = ["-my_field_name"]
# Methods
def get_absolute_url(self):
"""
Returns the url to access a particular instance of MyModelName.
"""
return reverse('model-detail-view', args=[str(self.id)])
def __str__(self):
"""
String for representing the MyModelName object (in Admin site etc.)
"""
return self.field_name
接下来分别介绍字段(Fields),元数据(Metadata)和方法(Methods)
1.1 Fields
一个模型可以有任意数量的字段,或任意的类型——每个用一行呈现我们想存储进数据库的数据。
my_field_name = models.CharField(max_length=20, help_text="Enter field documentation")
上面的例子有一个单域,叫做my_field_name,类型是models.CharField
字段类型还可以获取参数,进一步指定字段如何存放或如何被使用。
- max_length=20 — 表示此字段中值的最大长度为20个字符的状态。
- help_text=“Enter field documentation” — 提供一个帮助用户的文本标签,让用户知道当前透过html表单输入时要提供什么值。
常用的参数:
- help_text :提供HTML表单文本标签(eg i在管理站点中),如上所述。
- verbose_name :字段标签中的可读性名称,如果没有被指定,Django将从字段名称推断默认的详细名称。
- default :该字段的默认值。这可以是值或可调用对象(callable object),在这种情况下,每次创建新纪录时都将调用对象。
- null:如为True,即允许Django于数据库该栏位写入NULL(但栏位型态如为CharField则会写入空字串)。预设值是False。
- blank :如果True,表单中的字段被允许为空白。默认是False,这意味着Django的表单验证将强制你输入一个值。这通常搭配 NULL=True 使用,因为如果要允许空值,你还希望数据库能够适当地表示它们。
- choices :这是给此字段的一组选项。如果提供这一项,预设对应的表单部件是「该组选项的列表」,而不是原先的标准文本字段。
- primary_key :如果是True,将当前字段设置为模型的主键(主键是被指定用来唯一辨识所有不同表记录的特殊数据库栏位(column))。如果没有指定字段作为主键,则Django将自动为此添加一个字段。
常用的字段类型:
- CharField 是用来定义短到中等长度的字段字符串。你必须指定max_length要存储的数据。
- TextField 用于大型任意长度的字符串。你可以max_length为该字段指定一个字段,但仅当该字段以表单显示时才会使用(不会在数据库级别强制执行)。
- IntegerField 是一个用于存储整数(整数)值的字段,用于在表单中验证输入的值为整数。
- DateField 和DateTimeField 用于存储/表示日期和日期/时间信息(分别是Python.datetime.date 和 datetime.datetime 对象)。这些字段可以另外表明(互斥)参数 auto_now=Ture(在每次保存模型时将该字段设置为当前日期),auto_now_add(仅设置模型首次创建时的日期)和 default(设置默认日期,可以被用户覆盖)。
- EmailField 用于存储和验证电子邮件地址。
- FileField 和ImageField 分别用于上传文件和图像(ImageField 只需添加上传的文件是图像的附加验证)。这些参数用于定义上传文件的存储方式和位置。
- AutoField 是一种 IntegerField 自动递增的特殊类型。如果你没有明确指定一个主键,则此类型的主键将自动添加到模型中。
- ForeignKey 用于指定与另一个数据库模型的一对多关系(例如,汽车有一个制造商,但制造商可以制作许多汽车)。关系的“一”侧是包含密钥的模型。
- ManyToManyField 用于指定多对多关系(例如,一本书可以有几种类型,每种类型可以包含几本书)。具有参数 on_delete 来定义关联记录被删除时会发生什么(例如,值 models.SET_NULL 将简单地设置为值NULL )。
1.2 Metadata
class Meta:
ordering = ['-my_field_name']
此元数据最有用的功能之一是控制在查询模型类型时返回之记录的默认排序。
如上所示,你可以通过在ordering属性的字段名称列表中指定匹配顺序来执行此操作。
排序将依赖字段的类型(字符串字段按字母顺序排序,而日期字段按时间顺序排序)。
你可以使用减号(-)对字段名称进行前缀,以反转排序顺序。
例如,如果我们选择依照此预设来排列书单:
ordering = ['title', '-pubdate']
书单通过标题依据–字母排序–排列,从A到Z,然后再依每个标题的出版日期,从最新到最旧排列。
1.3 Methods
在每个模型中,你应该定义标准的Python类方法__str__() ,来为每个对象返回一个人类可读的字符串。
此字符用于表示管理站点的各个记录(以及你需要引用模型实例的任何其他位置)。
通常这将返回模型中的标题或名称字段。
Django 自动生成的 admin 里也使用这个方法来表示对象。
def __str__(self):
return self.field_name
Django方法中另一个常用方法是 get_absolute_url() ,这函数返回一个在网站上显示个人模型记录的URL(如果你定义了该方法,那么Django将自动在“管理站点”中添加“在站点中查看“按钮在模型的记录编辑栏)。
get_absolute_url()的典型示例如下:
def get_absolute_url(self):
"""Returns the url to access a particular instance of the model."""
return reverse('model-detail-view', args=[str(self.id)])
注意 :假设你将使用URL /myapplication/mymodelname/2
来显示模型的单个记录(其中“2”是id特定记录),则需要创建一个URL映射器来将响应和id传递给“模型详细视图” (这将做出显示记录所需的工作)。以上示例中,reverse()函数可以“反转”你的url映射器(在上诉命名为“model-detail-view”的案例中,以创建正确格式的URL。
当然要做这个工作,你还需要写URL映射,视图和模版。
2. 管理模型
# 1. 创建一条记录
# Create a new record using the model's constructor.
a_record = MyModelName(my_field_name="Instance #1")
# Save the object into the database.
a_record.save()
# 2. 修改一条记录
# Access model field values using Python attributes.
print(a_record.id) #should return 1 for the first record.
print(a_record.my_field_name) # should print 'Instance #1'
# Change record by modifying the fields, then calling save().
a_record.my_field_name="New Instance Name"
a_record.save()
可以使用模型的 objects 属性(由base class提供)搜寻符合某个条件的纪录
更多用法参考官方文档:https://docs.djangoproject.com/zh-hans/3.2/ref/models/querysets/
all_books = Book.objects.all()
wild_books = Book.objects.filter(title__contains='wild')
# 筛选书名里有"wild"的书并且计算总数
number_wild_books = Book.objects.filter(title__contains='wild').count()
要对比的字段和个对比方法用两个下划线连接
对比字段__对比方法
还有很多比对方式可以使用:
- icontains(不区分大小写)
- iexact(不大小写区分且完全符合)
- exact(区分大小写但完全符合)
- in(在一个给定的可迭代对象中)
- gt(大于)
- startswith
通过某个一对多的字段来筛选(例如一个外键)
# 筛选book中,体裁的名称包含“fiction”的对象
books_containing_genre = Book.objects.filter(genre__name__icontains='fiction')
# Will match on: Fiction, Science fiction, non-fiction etc.
3. Django 管理员站点
Django 全自动地根据模型创建后台界面。
Django 产生于一个公众页面和内容发布者页面完全分离的新闻类站点的开发过程中。站点管理人员使用管理系统来添加新闻、事件和体育时讯等,这些添加的内容被显示在公众页面上。Django 通过为站点管理人员创建统一的内容编辑界面解决了这个问题。管理界面不是为了网站的访问者,而是为管理者准备的。
3.1 注册模型
注册模型
首先,在目录应用程序(/locallibrary/catalog/admin.py)中打开 admin.py 。注意它已经导入了django.contrib.admin:
from django.contrib import admin
# Register your models here.
# 通过将以下文本复制到文件的底部来注册模型。
# 该代码简单地导入模型,调用 admin.site.register 来注册它们。
from .models import Author, Genre, Book, BookInstance
admin.site.register(Book)
admin.site.register(Author)
admin.site.register(Genre)
admin.site.register(BookInstance)
3.2 创建一个管理员账号
首先,我们得创建一个能登录管理页面的用户。请运行下面的命令:
python manage.py createsuperuser
键入你想要使用的用户名,然后按下回车键:
Username: admin
然后提示你输入想要使用的邮件地址:
Email address: admin@example.com
最后一步是输入密码。你会被要求输入两次密码,第二次的目的是为了确认第一次输入的确实是你想要的密码。
Password: **********
Password (again): *********
Superuser created successfully.
3.3 登录并使用管理员站点
登录网站,打开 /admin (e.g. http://127.0.0.1:8000/admin)
输入你的新超级用户名和密码凭据
即使不注册任何模型,也会看到几种可编辑的内容:组和用户。
它们是由 django.contrib.auth 提供的,这是 Django 开发的认证框架。
Users中存储了我们刚创建的超级用户的信息。
3.4 高级内容
可以进一步自定义界面,使它更容易使用,你可以改进的一些想法:
- 视图列表:
- 添加每个记录显示的其他字段/信息
- 添加过滤器以根据日期或某些其他选择值(例如图书货款状态)选择列出哪些记录。
- 在列表视图中的操作菜单中添加其他选项,并选择此菜单在表单上显示的位置。
- 详细视图
- 选择要显示(或排除)的字段,以及其顺序,分组,是否可编辑,使用的小部件,方向等。
- 将相关字段添加到记录以允许内联编辑(例如:添加在创建作者记录时添加和编辑图书记录的功能)。
具体参考django文档
以上是关于Django后端开发学习笔记使用Models并在Django自带管理页面中管理数据的主要内容,如果未能解决你的问题,请参考以下文章
Django后端开发学习笔记使用动态修改fields的序列化器实现指定字段的查询以及RESTful风格的信息过滤
Django后端开发学习笔记使用动态修改fields的序列化器实现指定字段的查询以及RESTful风格的信息过滤