話不多說,直接上代碼吧:
from django.db import models
from datetime import datetime
from django.db import models
# from DjangoUeditor.models import UEditorField
from django.db.models.query import QuerySet
# Create your models here.
# 重寫QuerySet
class CustomQuerySet(QuerySet):
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 CategoryManager(models.Manager):
def get_queryset(self):
return CustomQuerySet(self.model, using=self._db)
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 = CategoryManager()
class Meta:
verbose_name = "商品類別"
verbose_name_plural = verbose_name
def __str__(self):
return self.name
主要重寫了兩個類:
- CategoryManager
- CustomQuerySet
- objects = CategoryManager()
測試結果:
In [1]: from test01.models import GoodsCategory
In [2]: GoodsCategory.objects.all()
Out[2]: <CustomQuerySet [<GoodsCategory: luojun>]>
In [3]: GoodsCategory.objects.all().create(name='123')
==========create
In [4]: GoodsCategory.objects.all().delete()
==========delete
In [5]: GoodsCategory.objects.create(name='123')
==========create
>>> GoodsCategory.objects.all().update(name='123')
===================== {'name': '123'}
1
注:測試的時候沒有回調super方法,所以沒有返回結果
save 方法需要在模型內重寫