详细讲解如何使用 Django 模型 使用 VS 选择
模型字段
字段类型:
- AutoField:自增 IntegerField。如果要自定义主键,则需要primary_key。通常不直接使用,因为Django会自动为每个表(primary_key)超过254个字符添加一个自增主键(primary_key),应该使用TextField——它可以存储任意长度的文本,对应的数据库类型为lonetext 。如果未设置 max_length,则会显示错误消息。
- DateField:用Python的datetime.date实例保存的日期,记录年、月、日。它也是映射数据库中的日期类型。该字段类型可以指定以下参数:
- auto_now = True:保存所有时间对象,自动将字段设置为当前时间(可用于修改字段);
- auto_now_add = True:第一次创建对象时自动设置当前时间。注意,自动保存时间的时区使用默认时区(可用于创建字段)。
- DateTimeField:使用Python的datetime.datetime实例来显示映射到数据库中日期时间类型的日期时间。
- 文本字段:存储大字符串(大于254个字符),映射到数据库如下:longtext类型。
- BigIntegerField:从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的 64 位整数。
- IntegerField:整数,取值范围为-2147483648 - 2147483647。
- Binary Field:存储二进制字段,仅支持字节赋值。
- BooleanField:存储True或False值,数据库级别:类型tinyint,如果不指定默认值,则默认值为None。如果该字段可以为空,则类型必须设置为NullBooleanField,否则系统会抛出错误。
- 浮点字段:存储浮点数的字段类型,使用Python的Float实例来显示浮点数。
- UUIDField:用于存储UUID的字段。使用Python的UUID类。
- ForeignKey:几个之间的连接。
- ManyToManyField:多对多关系。
- OneToOneField:一对一的关联关系。
- 小数字段:用于计算价格或存储金融项目总和的一类字段:表示固定精度小数的货币字段。两个强制参数:
- max_digits:允许的大位数;
- decimal_places:最大小数位数。
- 例如:要存储的数字:最大长度4位,小数点后2位小数,model.DecimalField( max_digits=4,decimal_places=2)。
参数说明
- null = True – 数据库字段是否可以为空,True可以为空,默认:False不能为空。
- blank = True - 在 Django 后台添加数据时允许空值。与null的区别在于,null是纯数据库级别,而empty是表单验证级别。
- primary_key = False - 主键。设置 AutoField 类型字段的主键后,ID 列而不是原始列会递增。如果你没有为模型中的任何字段指定primary_key=True,Django会自动添加一个IntegerField来保存主键,因此你不需要在任何字段中设置primary_key=True,除非你想覆盖默认主键行为。 。
- auto_now= True – 每次保存或添加都会创建当前时间(可用于更改/编辑时间字段)
- auto_now_add = True – 每次保存或添加都会保存第一次创建的时间(可以是用于创建时间字段)字段)
- max_length - 定义字符串的最大长度。
- default - 指定字段的默认值。注意:如果要设置默认值,必须设置null=True。如果没有传递任何值并且没有设置null=True,那么即使设置了默认值并将其保存到数据库,它也将为null。
- unique = True - 不允许重复,例如用户密码等。
- auto_create = False - 自动创建。
- upload_to – 文件上传到指定目录。
- db_column - 您可以更改数据库中的字段名称。如果未设置此字段,则使用模型中属性的名称。
- 选项:用作字段选项的行序列。如果指定了一行,则默认表单小部件是一个复选框而不是标准文本字段,并限制提供的选项。
使用选项
class TestModel(models.Model):
GENDER_CHOICE = (
('M', '男'),
('F', '女'),
)
name = models.CharField(max_length=60)
gender = models.CharField(max_length=1, choices=GENDER_CHOICE)
一对多
class Author(models.Model):
"""新闻发布者表,机构表,作者表"""
# 这张表会被django自动创建
# 这个字段对应MySQL里面的varchar(70)类型
name = models.CharField(max_length=70)
# 自动创建:article_set
def __str__(self):
"""这个方法,在print(reporter)的时候,会被调用,
返回值是什么,打印的就是什么"""
return self.name
class Article(models.Model):
"""文章表"""
# 发布日期
pub_date = models.DateField()
# 标题
title = models.CharField(max_length=200)
# 内容
content = models.TextField()
# 作者,外键关联作者表
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
多对多
创建模型
class Teacher(models.Model):
name = models.CharField(max_length=72)
class Student(models.Model):
name = models.CharField(max_length=72)
teachers = models.ManyToManyField(Teacher)
多之间关系的本质实际上是一张映射两个表之间关系的表。 Django 的实现也是如此,只不过 Django 可以帮助隐藏映射细节。我们不必担心具体的实现,我们只需要在模型中声明它即可。然而,Django默认帮助我们在底层创建第三个表。
第三个表中,最重要的是表1和表2有外键。通过这两个外键的值可以指定两个表之间的关系。 。
向多对多关系添加新数据
from index.models import Teacher
lls = Teacher.objects.create(name="李老师")
zls = Teacher.objects.create(name="张老师")
from index.models import Student
zs = Student.objects.create(name="张三")
zs.teachers.add(lls)
zs.save()
多对多关系,如何反向向主表添加多对多关系
from index.models import Teacher
lls = Teacher.objects.create(name="李老师")
zls = Teacher.objects.create(name="张老师")
from index.models import Student
zs = Student.objects.create(name="张三")
zs.teachers.add(lls)
zs.save()
zls.student_set.add(zs)
zls.save()
一对一
创建自定义模型。
class User(models.Model):
name = models.CharField(max_length=72)
class UserDetail(models.Model):
address = models.CharField(max_length=255)
intro = models.CharField(max_length=255)
user = models.OneToOneField(to=User, on_delete=models.CASCADE)
基本用法与外键类似。
from index.models import User, UserDetail
zs = User.objects.create(name='张三')
zs.id
zsd = UserDetail.objects.create(address='', intro='', user=zs)
zsd
zsd.user.name
zs.userdetail.address
模型元数据
模型元数据是由一个名为Meta的内部类定义的,一般用于解释和说明模型的表级描述信息。它通常包含:
- sort:这是一个数组,定义查询结果的排序规则。默认为按 ID 升序排列。
- verbose_name 和 verbose_name_plural:这两个字段之一定义单数时在后台管理界面显示的表名称,另一个定义复数时后台管理界面显示的表名称。它的值是一个字符串,通常设置为相同的值。
- db_table:其值为一个字符串,指定数据库中模型对应的表名。默认为“应用程序名称小写_模型_名称小写”。在其他系统中,博客表通常称为blog,但在Django中默认可以是blog_blog,所以如果你正在与其他团队协作开发,这个属性将非常有用。
Model方法
str覆盖模型字符串
class User(models.Model):
name = models.CharField(max_length=72)
def __str__(self):
return f"<User {self.id}:{self.name}>"
save save
save方法主要用于添加和修改。如果该对象不存在,则意味着添加它;如果已经存在,则表示需要修改。基本用法是查询或创建模型的实例对象,分配或修改其属性,然后调用 save 方法。 Create
from index.models import User
zs = User(name='张三')
zs.save()
创建create方法
,该方法不太常用,通常会保存。Create有一个很大的缺点,就是如果我们传递错误的参数,它会直接崩溃。但创造还有一个优点,就是能够用一组代码解决新问题。示例代码:
# 基本用法
User.objects.create(name='李四')
# 通过字典创建
data = {'name': '王五'}
User.objects.create(**data)
全部查询
all是最简单、最通用的查询方式。它实际上不会立即获取数据,除非我们将其转发到前台或通过它。因此,理论上,当我们执行所有查询时,内存不会显着增加。它只能在使用过程中突然增长。底层实际上是基于生成器原理,生成查询语句并返回一个可迭代对象。然而,它实际上并不将数据存储在内存中,而是为我们提供了一种获取所有数据的方法。使用方法如下:
# 基本用法
User.objects.all()
# 通过切片取前两条
User.objects.all()[:2]
分页查询:
# 每页2条,取第1页
User.objects.all()[0:0+2]
# 每页2条,取第2页
User.objects.all()[2:2+2]
firs取第一条
User.objects.first()
last取最后一条
User.objects.last()
sort_by_sort
# 根据ID升序
User.objects.all().order_by("id")
# 根据ID降序
User.objects.all().order_by("-id")
根据字段查询查询
# 根据ID查询
User.objects.get(id=1)
# 根据字段查询
# 注意:如果返回个数大于会抛出异常
User.objects.get(name='张三')
删除删除
# 根据get删除
User.objects.get(name='李四').delete()
# 删除第一个
User.objects.first().delete()
# 删除最后一个
User.objects.last().delete()
# 根据ID删除
User.objects.get(id=1).delete()
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。