用组名注释django用户queryset

米斯巴

鉴于我有一个Django模型,该模型具有一个与其自身链接的ForeignKey。

class DjangoModel():

    [...]

    successor = models.ForeignKey('self', null=True)

我能够编写一个自定义的django数据库函数,如下所示:

from django.db.models import BooleanField
from django.db.models import Func


class IsNull(Func):
    """
    See docs: https://docs.djangoproject.com/en/1.8/ref/models/database-functions/
    """
    template = '%(expressions)s IS NULL'

    def __init__(self, *args, **kwargs):
        kwargs['output_field'] = BooleanField()
        super(IsNull, self).__init__(*args, **kwargs)

所以我可以这样做:

queryset = DjangoModel.objects.all()
queryset = queryset.annotate(**{'is_latest': IsNull('successor')})

如果使用queryset.values()..我得到

[{'pk': 1, is_latest': True}, {'pk': 2, 'is_latest': False}, ]

其中,is_latest == Truesuccessor对象的字段为NULL

现在我想做类似的事情,但是不知道从哪里开始!

捆绑商品django.contrib.auth.models.User具有“多对多”关系django.contrib.auth.models.Group模型

对于我的项目,有多种用户组类型,例如客户/营销/财务等

我想要做的..是一个注释User与查询集is_FOO场,其中FOO一个组名。例如is_customeris_marketing

因此,如果我.values()在查询集上使用,应该会得到以下信息:

[{'pk': 1, 'is_customer': True, 'is_marketing': False }, {'pk': 1, 'is_customer': True, 'is_marketing': True }]

组名可以是硬编码的,例如

queryset.annotate(**{'is_customer': IsGroupMember('customer')}) 

我只需要有关IsGroupMember数据库功能的帮助

那有可能吗?有什么提示或技巧可以帮助我入门吗?

任何帮助将不胜感激。非常感谢

米斯巴

我有2个解决问题的方法:-)

鉴于我正在使用django auth用户模型

from django.contrib.auth.models import User

以及我感兴趣的群组名称:

CUSTOMER_GROUP_NAME = 'customer'

解决方案1-django-users google组中的Todor Velichkov建议

他的回答略有修改,如下所示:

from django.db.models.expressions import RawSQL


def is_group_member(group_name):
    return RawSQL("""EXISTS(
        SELECT 1 FROM `auth_group`
        WHERE `auth_group`.`name` = %s
            AND `auth_group`.`id` IN (
                SELECT `auth_user_groups`.`group_id`
                FROM `auth_user_groups`
                WHERE `auth_user_groups`.`user_id` = `auth_user`.`id`
            )
    )""", (group_name,), output_field=BooleanField())


qs1 = User.objects.all().annotate(is_customer=is_group_member(CUSTOMER_GROUP_NAME))

链接到原始答案:https : //groups.google.com/d/msg/django-users/BLCGZtUzEcY/w5w87frbBgAJ


我进行了更多研究,并了解了Django条件表达式。

文件:https//docs.djangoproject.com/en/1.9/ref/models/conditional-expressions/

解决方案2 —使用Django表达式:-)

from django.contrib.auth.models import User
from django.db.models import BooleanField
from django.db.models import When, Case, Value

query = When(groups__name__in=[CUSTOMER_GROUP_NAME, ], then=Value(1))
qs2 = User.objects.annotate(
    is_customer=Case(query, default=Value(0), output_field=BooleanField()))

我认为“解决方案2”更简洁易读。所以我会用它:-)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Django ORM注释:最常见的一组用户queryset

来自分类Dev

Django QuerySet用子查询注释

来自分类Dev

Django QuerySet用子查询注释

来自分类Dev

Django按月注释组

来自分类Dev

在Django queryset中使用注释

来自分类常见问题

Django queryset注释过滤器(最大)

来自分类Dev

Django queryset附加或注释相关对象字段

来自分类Dev

django模型方法返回带注释的queryset

来自分类Dev

Django queryset注释过滤器(最大)

来自分类Dev

Django 1.8 queryset上的条件注释

来自分类Dev

使用过滤的组注释用户对象

来自分类Dev

仅限用户Django的注释模型

来自分类Dev

在Django中按月/年注释(组)日期

来自分类Dev

Django-按组注释加权AVG

来自分类Dev

用每个条/组的观察数注释ggplot箱图面

来自分类Dev

用每个条/组的观察数注释ggplot箱图面

来自分类Dev

Django:如何获取当前用户的组ID

来自分类Dev

Django从所有组中删除用户

来自分类Dev

Django用户组仅用于权限?

来自分类Dev

基于组的Django用户的条件属性

来自分类Dev

在 Django 中以用户编辑形式编辑组

来自分类Dev

django表单在queryset中获取当前用户

来自分类Dev

django表单在queryset中获取当前用户

来自分类Dev

在Django Rest Framework中注册用户并为用户设置组

来自分类Dev

在Django Rest Framework中注册用户并为用户设置组

来自分类Dev

Django ValueError - 将用户添加到用户组

来自分类Dev

Django userAdmin中的Django用户到组和groupAdmin中的组到用户

来自分类Dev

将以逗号分隔的相关项目列表注释到Django queryset上

来自分类Dev

如何在Django-rest-framework queryset响应中添加注释数据?