定义为团队用户的Django ORM注释布尔字段 [英] Django ORM Annotate boolean field that defines is user member of a team

查看:141
本文介绍了定义为团队用户的Django ORM注释布尔字段的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

models.py

from django.db import models


class UserGroup(models.Model):
    members = models.ManyToManyField(User, related_name='members', through='UserGroupMember')


class UserGroupMember(models.Model):
    user = models.ForeignKey(User)
    usergroup = models.ForeignKey(UserGroup)


class Cohort(models.Model):
    user_groups = models.ManyToManyField(UserGroup)


class Team(models.Model):
    cohort = models.ForeignKey(Cohort)
    members = models.ManyToManyField(User, related_name='team_members', through='TeamMembers', blank=True)


class TeamMembers(models.Model):
    team = models.ForeignKey(Team)
    user = models.ForeignKey(User)

单个用户可以是

我想注释新字段(布尔值),它告诉您是分配给该用户的用户同类群组中的某个团队,例如:

I want to annotate the new field (boolean) which tells you is the user assigned to some team in the cohort, something like:

User.objects.filter(
    members__cohort=cohort
).annotate(
    is_team_member=...
)






我正在使用Python 2.7.13和Django 1.9.8。谢谢。


I am using Python 2.7.13 and Django 1.9.8. Thanks.

推荐答案

我设法通过加入同类模型并使用条件表达式:

I managed to solve the problem by doing the join to the Cohort model and using conditional expressions:

from django.db.models import Case, When, Value, IntegerField


users = User.objects.filter(
    members__cohort=cohort
).annotate(
    is_team_member=Case(When(team_members__cohort=cohort, then=Value(1)), default=0, output_field=IntegerField())
)

现在我例如,可以轻松过滤属于某个团队的用户:

Now I can easily filter, for example, users who are part of some team:

users.filter(is_team_member=1)

这篇关于定义为团队用户的Django ORM注释布尔字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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