Django4.0 管理器-創(chuàng)建帶有QuerySet方法的管理器

2022-03-16 18:04 更新

要替換前面的要求復制 ?QuerySet ?和 ?Manager ?方法的方案, 可以用 ?QuerySet.as_manager()? 創(chuàng)建一個 ?Manager ?實例,拷貝了自定義 ?QuerySet ?的方法:

class Person(models.Model):
    ...
    people = PersonQuerySet.as_manager()

由 ?QuerySet.as_manager()? 創(chuàng)建的 ?Manager ?實例實質上等價于前面例子中的 ?PersonManager?。
不是每個 ?QuerySet ?方法在 ?Manager ?層都是有意義的;例如,我們故意阻止 ?QuerySet.delete()? 被拷貝進 ?Manager ?類中。
方法拷貝規(guī)則如下:

  • 公開方法默認會被拷貝。
  • 私有方法(以下劃線打頭)默認不會被復制。
  • ?queryset_only ?屬性值為 ?False ?的方法總是會被復制。
  • ?queryset_only ?屬性值為 ?True ?的方法永遠不會被復制。

例如:

class CustomQuerySet(models.QuerySet):
    # Available on both Manager and QuerySet.
    def public_method(self):
        return

    # Available only on QuerySet.
    def _private_method(self):
        return

    # Available only on QuerySet.
    def opted_out_public_method(self):
        return
    opted_out_public_method.queryset_only = True

    # Available on both Manager and QuerySet.
    def _opted_in_private_method(self):
        return
    _opted_in_private_method.queryset_only = False

from_queryset()

classmethod from_queryset(queryset_class)

對于進階用法,你可能同時要一個自定義 ?Manager ?和一個自定義 ?QuerySet?。你可以通過調用 ?Manager.from_queryset()? 達成目的,這將會返回一個自定義基礎 ?Manager ?的子類,帶有一份自定義 ?QuerySet ?方法的拷貝:

class CustomManager(models.Manager):
    def manager_only_method(self):
        return

class CustomQuerySet(models.QuerySet):
    def manager_and_queryset_method(self):
        return

class MyModel(models.Model):
    objects = CustomManager.from_queryset(CustomQuerySet)()

還可以將生成的類存儲到變量中:

MyManager = CustomManager.from_queryset(CustomQuerySet)

class MyModel(models.Model):
    objects = MyManager()


以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號