Django中的模型小总结:

python 复制代码
from django.db import models
from django.urls import reverse
 
# 自定义Manager方法
class HighRatingManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(rating=1)

# CHOICES选项
class Rating(models.IntegerChoices):
    VERYGOOD = 1, 'Very Good'
    GOOD = 2, 'Good'
    BAD = 3, 'Bad'

class Product(models.Model):
    # 数据表字段
    name = models.CharField('name', max_length=30)
    rating = models.IntegerField(max_length=1, choices=Rating.choices)
 
    # MANAGERS方法
    objects = models.Manager()
    high_rating_products =HighRatingManager()
 
    # META类选项
    class Meta:
        verbose_name = 'product'
        verbose_name_plural = 'products'
 
    # __str__方法
    def __str__(self):
        return self.name
 
    # 重写save方法
    #原本(父类manager)的save方法于保存对象到数据库中
    def save(self, *args, **kwargs):
        do_something()#在保存对象之前执行某些操作
        super().save(*args, **kwargs) #调用了父类的 save 方法
        do_something_else()
 
    # 定义单个对象绝对路径
    def get_absolute_url(self):
        return reverse('product_details', kwargs={'pk': self.id})
 
    # 其它自定义方法
    def do_something(self):

1.自定义的manager方法:

用途:特定需求添加额外的查询逻辑或方法

创建一个继承自models.Manager的新类,然后在这个类中定义需要的自定义查询方法。

例子:

python 复制代码
class HighRatingManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(rating=1)
'''自定义一个类HighRatingManager继承models.Manager,并重写了get_queryset方法:返回评级(rating字段)为1的对象
其中:super().get_queryset()是调用父类Manager的get_queryset()方法;filter(rating=1)是对查询集的过滤操作。它告诉数据库只选择rating字段值为1的对象。
'''

2.CHOICES选项:

用途:通常用于定义模型字段的可选值,它可以帮助限制字段的值,同时提供了在数据库中存储简短标识符而显示用户友好的文本描述的能力。

python 复制代码
# CHOICES选项
class Rating(models.IntegerChoices):
    VERYGOOD = 1, 'Very Good'
    GOOD = 2, 'Good'
    BAD = 3, 'Bad'

每一个元组常量(等号前面大写的字符),有两个输入。第一个是选项即上面可见的1,2,3。第二个就是供用户看到的字符串(显示用户友好的文本描述的能力的体现)。

3.meta类选项:

作用:用于定义模型的元数据(metadata)

1.db_table:

指定模型映射到的数据库表的名称。

2.ordering:

指定模型在查询时的默认排序方式。

python 复制代码
class Meta:
        ordering = ['name', '-rating']
#表示该模型按照name字段进行降序排列

3.manages:

默认为True,如果为False,Django 将不会为该模型管理数据库表。

4.permissions:

python 复制代码
permissions = [
    ('can_view', 'Can view model'),
    ('can_change', 'Can change model'),
]
#'can_view' 和 'can_change' 是权限的代号(codename),它们是程序中引用这些权限的标识符。
#'Can view model' 和 'Can change model' 是这些权限的描述性名称,它们是显示给用户看的名称,通常用于用户界面和文档中。

4.数据表字段:

就是数据库里面的一列。分为基础字段和关系字段

1.基础字段:

  • **CharField:**用于存储较短的字符串,指定最大长度
python 复制代码
models.CharField(max_length=100)  # 限制最大长度为100个字符
  • **TextField:**适用于存储较长的文本内容,没有最大长度限制,但是可以指定最大长度。
  • **IntegerField, FloatField, DecimalField:**分别用于存储整数、浮点数和固定精度的十进制数。
python 复制代码
models.DecimalField(max_digits=8, decimal_places=2)
#最多8位数,小数点后2位
  • BooleanField:用于存储布尔值(True或False)
  • DateField, DateTimeField: 分别用于存储日期和日期时间。
  • EmailField: 用于存储电子邮件地址,自动验证格式。

要将普通字段设为必填字段,需要设置 blank=False或者null=False。

用default=''''设置默认值

2.关系字段:

  • ForeignKey: 用于定义多对一关系,将模型与另一个模型的主键关联起来。
python 复制代码
class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
#这个多对一的关联,一个作者可以对应多本书。on_delete=models.CASCADE表示当书被删除的时候,与之关联的作者也被删除
#'product_details'应该是在URL配置中定义的一个名字,与某个路径相关联,并且这个路径应该接受一个主键参数来显示特定产品的细节。
  • ManyToManyField: 用于定义多对多关系,允许一个模型关联多个目标模型实例
  • **OneToOneField:**用于定义一对一关系,每个对象实例关联到另一个唯一的对象实例。

5.manager方法:

可以包含继承的manger方法也可以引入自定义的manager方法

6.__str__方法:

当你使用 str() 函数或者在打印对象时候,会调用对象的 __str__ 方法来获取该对象的字符串表示形式(这里是对象的name属性)。(对象就是数据库里面的一行)

7.定义单个对象绝对路径:

python 复制代码
 # 定义单个对象绝对路径
    def get_absolute_url(self):
        return reverse('product_details', kwargs={'pk': self.id})
#reverse 函数是 Django 提供的一个反向解析 URL 的工具,它接受一个视图的名称(path函数里面的name)和必要的参数(同一个name下不允许重复)来生成对应的 URL。

id是模型默认的主键字段。

相关推荐
无为之士3 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
小汤猿人类17 分钟前
open Feign 连接池(性能提升)
数据库
阳冬园38 分钟前
mysql数据库 主从同步
数据库·主从同步
Mr.132 小时前
数据库的三范式是什么?
数据库
Cachel wood2 小时前
python round四舍五入和decimal库精确四舍五入
java·linux·前端·数据库·vue.js·python·前端框架
Python之栈2 小时前
【无标题】
数据库·python·mysql
风_流沙2 小时前
java 对ElasticSearch数据库操作封装工具类(对你是否适用嘞)
java·数据库·elasticsearch
亽仒凣凣2 小时前
Windows安装Redis图文教程
数据库·windows·redis
亦世凡华、2 小时前
MySQL--》如何在MySQL中打造高效优化索引
数据库·经验分享·mysql·索引·性能分析
YashanDB3 小时前
【YashanDB知识库】Mybatis-Plus调用YashanDB怎么设置分页
数据库·yashandb·崖山数据库