过滤器中的多种逻辑 [英] Multiple Logics in filter

查看:108
本文介绍了过滤器中的多种逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在实施ModelManger以保护隐私。

I'm implementing ModelManger for privacy.

基本上,对于这种情况,我想排除一些查询集

Basically, I want to exclude some queryset for this case


  1. 如果发布(布料)的字段 only_me true

  2. post(Cloth)的所有者尚未登录用户。

  1. if post(Cloth)'s field only_me is true
  2. and owner of post(Cloth) is not logged in user.

class ClothManager(models.Manager):
    def all(self, *args, **kwargs):
        return super(ClothManager, self).filter(???)


用例


  • 如果<$,则返回 qs c $ c> only_me == false

  • 如果 only_me =返回 qs = true user == self.request.user (我们可以叫 self.request.user 是否在模型中?)

  • 如果 only_me = true qs c>和 user不是self.request.user

  • returns qs if only_me==false
  • returns qs if only_me==true and user==self.request.user (Can we call self.request.user in Model?)
  • DO NOT return qs if only_me=true and user is not self.request.user

我可以使用 Q (如果需要)

I can use Q if it's needed

推荐答案

您可以尝试:

class ClothManager(models.Manager):
    def get_queryset(self, user=None, request=None, **kwargs):
        qs = super(ClothManager, self).get_queryset()
        user = request.user if not user else user
        if request:
            user = request.user if not user else user

        if user:
            qs = qs.exclude(Q(only_me=True) & ~Q(user=self.request.user))
        return qs

    def __call__(self, user=None, request=None, **kwargs):
        return self.get_queryset(user=user, request=request, **kwargs)

以及代码中的某个位置:

and somewhere in the code:

 qs = YourModel.objects(request=request)

这篇关于过滤器中的多种逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆