gpt4 book ai didi

python - 什么时候应该在 Django 中使用自定义管理器而不是自定义查询集?

转载 作者:IT老高 更新时间:2023-10-28 20:35:43 26 4
gpt4 key购买 nike

在 Django 中,自定义管理器是组织可重用查询逻辑的好方法。 Django documentation on Custom managers说:

There are two reasons you might want to customize a Manager: to add extra Manager methods, and/or to modify the initial QuerySet the Manager returns.

但是,it goes on to describe如何也可以创建自定义 QuerySet 类,并且可以使用 QuerySet.as_manager() 直接从数据模型作为管理器访问这些类:

The Manager instance created by QuerySet.as_manager() will be virtually identical to the PersonManager from the previous example.

在自定义 Manager 和/或自定义 QuerySet 类之间组织逻辑的方式似乎有很大的灵 active 。我应该根据什么原则来决定何时使用一种与另一种?

最佳答案

主要是为了便于查询组合。通常,如果您希望能够在查询集调用链中对现有查询集执行某些操作,您可以使用 QuerySet

例如,假设您有一个 Image 模型,该模型具有 widthheight 字段:

class Image(models.Model):
width = ... # Width in pixels
height = ... # Height in pixels

你可以编写一些自定义的 QuerySet 方法:

class ImageQuerySet(models.QuerySet): 
def landscapes(self):
return self.filter(width__gte=models.F('height'))

def portraits(self):
return self.filter(width__lte=models.F('height'))

def small(self):
return self.filter(width__lte=1200)

def large(self):
return self.filter(width__gte=1200)

class ImageManager(models.Manager):
def get_queryset(self):
return ImageQuerySet(self.model, using=self._db)

现在您可以轻松创建动态查询集:

Image.objects.all().portraits().small()
Image.objects.all().large().portraits()

从逻辑上讲,这些函数应该主要关注对查询集模型的现有查询集的分区或重新定义。对于您不在现有查询集上操作的情况,您根本不想返回查询集,或者您可能必须执行一些不涉及此特定模型的相关逻辑,而不是更适合的模型管理器。

关于python - 什么时候应该在 Django 中使用自定义管理器而不是自定义查询集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29798125/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com