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
的新类,然后在这个类中定义需要的自定义查询方法。
例子:
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选项:
用途:通常用于定义模型字段的可选值,它可以帮助限制字段的值,同时提供了在数据库中存储简短标识符而显示用户友好的文本描述的能力。
# 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:
指定模型在查询时的默认排序方式。
class Meta:
ordering = ['name', '-rating']
#表示该模型按照name字段进行降序排列
3.manages:
默认为True,如果为False,Django 将不会为该模型管理数据库表。
4.permissions:
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:用于存储较短的字符串,指定最大长度
models.CharField(max_length=100) # 限制最大长度为100个字符
- TextField:适用于存储较长的文本内容,没有最大长度限制,但是可以指定最大长度。
- IntegerField, FloatField, DecimalField:分别用于存储整数、浮点数和固定精度的十进制数。
models.DecimalField(max_digits=8, decimal_places=2)
#最多8位数,小数点后2位
- BooleanField:用于存储布尔值(True或False)
- DateField, DateTimeField: 分别用于存储日期和日期时间。
- EmailField: 用于存储电子邮件地址,自动验证格式。
要将普通字段设为必填字段,需要设置 blank=False或者null=False。
用default=''''设置默认值
2.关系字段:
- ForeignKey: 用于定义多对一关系,将模型与另一个模型的主键关联起来。
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.定义单个对象绝对路径:
# 定义单个对象绝对路径
def get_absolute_url(self):
return reverse('product_details', kwargs={'pk': self.id})
#reverse 函数是 Django 提供的一个反向解析 URL 的工具,它接受一个视图的名称(path函数里面的name)和必要的参数(同一个name下不允许重复)来生成对应的 URL。
id是模型默认的主键字段。