栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

自定义QuerySet和Manager而不破坏DRY?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

自定义QuerySet和Manager而不破坏DRY?

我实现此目标的方法是将实际值添加

get_active_for_account
为自定义方法
QuerySet
。然后,要使其脱离管理器,你只需捕获
__getattr__
并相应地将其返回

为了使该模式可重用,我将这些

Manager
位提取到单独的模型管理器中:

custom_queryset / models.py

from django.db import modelsfrom django.db.models.query import QuerySetclass CustomQuerySetManager(models.Manager):    """A re-usable Manager to access a custom QuerySet"""    def __getattr__(self, attr, *args):        try: return getattr(self.__class__, attr, *args)        except AttributeError: # don't delegate internal methods to the queryset if attr.startswith('__') and attr.endswith('__'):     raise return getattr(self.get_query_set(), attr, *args)    def get_query_set(self):        return self.model.QuerySet(self.model, using=self._db)

一旦掌握了这些,就可以在模型上将QuerySeta定义为自定义内部类,并将管理器设置为自定义管理器:

your_app / models.py

from custom_queryset.models import CustomQuerySetManagerfrom django.db.models.query import QuerySetclass Inquiry(models.Model):    objects = CustomQuerySetManager()    class QuerySet(QuerySet):        def active_for_account(self, account, *args, **kwargs): return self.filter(account=account, deleted=False, *args, **kwargs)

使用这种模式,以下任何一种都可以工作:

>>> Inquiry.objects.active_for_account(user)>>> Inquiry.objects.all().active_for_account(user)>>> Inquiry.objects.filter(first_name='John').active_for_account(user)

如果你将UPD与自定义用户(AbstractUser)一起使用,则需要

class CustomQuerySetManager(models.Manager):

from django.contrib.auth.models import UserManagerclass CustomQuerySetManager(UserManager):    ***


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/402426.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号