想要重寫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() # 默認Managerpublished = 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 modelsfrom 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_namedef __str__(self):return self.name
測試結果
GoodsCategory.objects.all()
<CustomQuerySet [<GoodsCategory: luojun>]>GoodsCategory.objects.all().create(name='123')
==========createGoodsCategory.objects.all().delete()
==========deleteGoodsCategory.objects.create(name='123')
==========create
GoodsCategory.objects.all().update(name='123')
===================== {'name': '123'}