【问题标题】:Django ORM Annotate boolean field that defines is user member of a teamDjango ORM Annotate 布尔字段定义是团队的用户成员
【发布时间】:2017-12-05 21:34:07
【问题描述】:

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)

单个用户只能属于一个群组中的一个团队。

我想对新字段(布尔值)进行注释,该字段告诉您分配给队列中某个团队的用户,例如:

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

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

【问题讨论】:

    标签: python django django-orm


    【解决方案1】:

    我设法通过加入Cohort 模型并使用条件表达式来解决问题:

    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())
    )
    

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

    users.filter(is_team_member=1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多