Code前端首页关于Code前端联系我们

详细讲解如何使用 Django 模型 使用 VS 选择

terry 2年前 (2023-09-24) 阅读数 178 #后端开发

模型字段

字段类型:

  • 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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门