想要重写create、update、delete方法我们先要了解一下其他的知识点
Manager
在Django中,Manager
是一个非常核心的概念,它负责与数据库交互,提供了访问和管理模型实例(即数据库中的记录)的方式。每个Django模型类默认都会有一个名为objects
的Manager实例,它是django.db.models.Manager
类的一个实例。Manager允许你执行查询操作,如获取、过滤、创建、更新或删除数据库中的记录。
例如:当你执行 Article.objects.all() 的时候,这里的objects实际上就是一个manager。
添加额外的Manager
除了默认的objects
Manager,你还可以定义自定义的Manager来满足特定的查询需求。
class PublishedManager(models.Manager):
def get_queryset(self):
return super().get_queryset().filter(status='published')
class Article(models.Model):
objects = models.Manager() # 默认Manager
published = PublishedManager() # 自定义Manager
# 使用自定义Manager
articles = Article.published.all()
自定义Manager方法
你还可以在Manager中定义自定义方法,以便封装复杂的查询逻辑。
# 自定义模型管理器类
class BookManager(models.Manager):
#自定义模型管理器中的方法
def title_count(self, keyword):
return self.filter(title_icountains=keyword).count()
class Book(models.Model):
title = models.CharField(max_length=100)
authors = models.ManyToManyField(Author)
...
objects = BookManager()
def __str__(self):
return self.title
>>> Books.objects.title_count('django') #这是我们自定义的manager中的查询方法
>>> Books.objects.filter(title__icontains='django').count() # 默认的查询方法依然可用(相当于上面的title_count)
重写create、update、delete方法
在Django中,结合模型管理器(Manager)来重写create
、update
(实际上是通过覆盖save
方法间接实现)和delete
方法,可以让你在执行这些基本的数据库操作时插入自定义的逻辑。下面是如何结合Manager来实现这些定制操作的例子:
from django.db import models
from datetime import datetime
from django.db import models
# from DjangoUeditor.models import UEditorField
# Create your models here.
# 重写QuerySet
class CustomQuerySet(models.Manager):
def update(self, **kwargs):
print('=====================', kwargs)
return super().update(**kwargs)
def create(self, *args, **kwargs):
print('==========create')
return super().create(*args, **kwargs)
def delete(self):
print('==========delete')
return super().delete()
class GoodsCategory(models.Model):
"""
商品分类
"""
CATEGORY_TYPE = (
(1, "一级类目"),
(2, "二级类目"),
(3, "三级类目"),
)
name = models.CharField('类别名', default="", max_length=30, help_text="类别名")
code = models.CharField("类别code", default="", max_length=30, help_text="类别code")
desc = models.TextField("类别描述", default="", help_text="类别描述")
# 目录树级别
category_type = models.IntegerField("类目级别", choices=CATEGORY_TYPE, help_text="类目级别")
# 设置models有一个指向自己的外键
parent_category = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True, verbose_name="父类目级别",
help_text="父目录",
related_name="sub_cat")
is_tab = models.BooleanField("是否导航", default=False, help_text="是否导航")
add_time = models.DateTimeField("添加时间", default=datetime.now)
# 设置对象管理类
objects = CustomQuerySet()
class Meta:
verbose_name = "商品类别"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
测试结果
GoodsCategory.objects.all()
<CustomQuerySet [<GoodsCategory: luojun>]>
GoodsCategory.objects.all().create(name='123')
==========create
GoodsCategory.objects.all().delete()
==========delete
GoodsCategory.objects.create(name='123')
==========create
GoodsCategory.objects.all().update(name='123')
===================== {'name': '123'}