django 重寫update,create,delete方法


話不多說,直接上代碼吧:

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

主要重寫了兩個類:

  1. CategoryManager
  2. CustomQuerySet
  3. 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 方法需要在模型內重寫


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM