Django 使用models.Manager扩展查询的方法

先来扩展一下使用.all()查询时,通过传入自定义参数返回不同的数据集

1、在模型中使用models.Manager
# 自定义扩展.all()方法
class MiddlewareRegionSplitManager(models.Manager):
    def all(self, user=None):
        if user:
        	# 当没有 region_split 并且 group_id 为1时返回所有数据 否则只返回与user.region_split所匹配的数据
            if not user.region_split and user.group_id == 1:
                return super().all()
            else:
                return super().all().filter(region_split=user.region_split)
        # 如果没有传入user参数 返回所有数据
        return super().all()

# 当所有模型都包含这些字段时,这里可以定义一个基本模型,让其他模型都继承与它
class BaseModel(models.Model):
    sort = models.IntegerField(default=1, null=True, blank=True, verbose_name='排序')
    content = models.TextField(default='', null=True, blank=True, verbose_name='描述')
    sort_time = models.DateTimeField(auto_now_add=True, verbose_name='排序时间')
    created = models.DateTimeField(auto_now_add=True, verbose_name='创建时间')
    updated = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    region_split = models.IntegerField(null=True, blank=True, verbose_name='所属区域')
    # 定义使用的models.Manager
    objects = MiddlewareRegionSplitManager()

    class Meta:
        abstract = True

# 定义一个系统字典模型
class ConfDict(SoftDeleteModel, BaseModel):
    dict_title = models.CharField(max_length=255, verbose_name='字典标题')
    dict_key = models.IntegerField(default=0, verbose_name='字典键值')
    dict_type = models.IntegerField(default=0, verbose_name='字典类型')

    class Meta:
        db_table = 'A_ConfDict_Table'
        verbose_name = '系统字典表'
        verbose_name_plural = verbose_name
        # unique_together = (('dict_title', 'region_split'), ) 设置联合唯一
2、在视图中使用
class CongDictViewset(ModelViewSet):
    '''
    修改局部数据
    create:  创建系统字典
    retrieve:  检索某个系统字典
    update:  更新系统字典
    destroy:  删除系统字典
    list:  获取系统字典列表
    '''
    queryset = ConfDict.objects.all().order_by('-updated')
    serializer_class = ConfDictSerializer
    authentication_classes = [JWTAuthentication, ]
    permission_classes = []
    # 频率验证
    throttle_classes = [VisitThrottle]
    # drf 过滤&搜索&排序
    filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter,)
    # 搜索
    search_fields = ('dict_title', 'content',)
    # 过滤
    filter_fields = ('dict_type',)
    # 排序
    ordering_fields = ('updated', 'sort_time', 'created',)
    pagination_class = Pagination

    def get_permissions(self):
    	# 指定get查询时 不需要权限
        if self.action == 'list':
            return []
        else:
            return [BasePermission()]
    
    def get_queryset(self):
        if self.request.auth:
        	# 当用户登录了 得到用户 user 参数 传入 .all()方法 来返回不同的结果
            return ConfDict.objects.all(user=self.request.user).order_by('-updated')
        # 当没有登录时正常返回
        return ConfDict.objects.all().order_by('-updated')
3、重新定义自己的方法
# 修改定义的 MiddlewareRegionSplitManager 类 如下示
class MiddlewareRegionSplitManager(models.Manager):
	def region(self, user=None):
        queryset = super().get_queryset()
        if user:
        	if not user.region_split and user.group_id == 1:
                pass
            else:
                queryset = queryset.filter(region_split=user.region_split)
        return queryset
4、在试图中使用

将 get_queryset 方法修改如下示

def get_queryset(self):
	if self.request.auth:
		# 当用户登录了 得到用户 user 参数 传入 .all()方法 来返回不同的结果
	    return ConfDict.objects.all().region(user=user).order_by('-updated')
	# 当没有登录时正常返回
	return ConfDict.objects.all().order_by('-updated')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

haeasringnar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值