Django结合Manager重写create、update、delete方法

想要重写create、update、delete方法我们先要了解一下其他的知识点

Manager

在Django中,Manager是一个非常核心的概念,它负责与数据库交互,提供了访问和管理模型实例(即数据库中的记录)的方式。每个Django模型类默认都会有一个名为objects的Manager实例,它是django.db.models.Manager类的一个实例。Manager允许你执行查询操作,如获取、过滤、创建、更新或删除数据库中的记录。

例如:当你执行 Article.objects.all() 的时候,这里的objects实际上就是一个manager。

添加额外的Manager

除了默认的objectsManager,你还可以定义自定义的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)来重写createupdate(实际上是通过覆盖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'}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值