Django ORM Annotate boolean field that defines is user member of a team

随声附和 提交于 2019-12-24 15:08:08

问题


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)

Single user can be part of only one team within a cohort.

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=...
)

I am using Python 2.7.13 and Django 1.9.8. Thanks.


回答1:


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)


来源:https://stackoverflow.com/questions/47663027/django-orm-annotate-boolean-field-that-defines-is-user-member-of-a-team

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!