定义为团队用户的Django ORM注释布尔字段 [英] Django ORM Annotate boolean field that defines is user member of a team
本文介绍了定义为团队用户的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屋!
查看全文