Django ORM - 根据直通表查询

创意密码机

这是我的数据模型:

class User(Model):

    name = models.CharField(max_length=255)
    teams = models.ManyToManyField(Team, through=UserTeam, related_name='users')

class Team(Model):

    name = models.CharField(max_length=255)

class UserTeam(models.Model):

    user = models.ForeignKey(User, on_delete=models.CASCADE)
    team = models.ForeignKey(Team, on_delete=models.CASCADE)
    is_special = models.BooleanField(default=True)

当我查询所有用户时,我得到这样的结果(其余 api 中的 json 结果:

{
    'name': 'user-1',
    'teams': [
        {
            'name': 'team-1',
        },
        {
            'name': 'team-2',
        }
    ]
}

我想要实现的是,我只想获取用户和团队的 is_special 标志设置为 true 的团队。

例如,当一个用户在两个团队中并且一个团队的is_special标志设置为 false 时,那么应该从上面的结果中排除这个团队......

这就是为什么我包含在我的用户序列化程序中的原因:

teams = TeamSerializer(read_only=True, many=True)

def get_teams(self, obj):
    teams = Team.objects.filter(
        userteam__user=self.context['request'].user,
        userteam__is_special=True
    )
    serializer = UserSerializer(instance=teams, many=True)
    return serializer.data

但我仍然得到相同的结果......有什么想法或建议吗?

谢谢!

史蒂夫·贾利姆

您可能会从直通表中获得更多成功。

我还没有测试过这个,它不是最佳性能,但是:

teams = TeamSerializer(read_only=True, many=True)

...

def get_teams(self, obj):
    user_teams = UserTeam.objects.filter(
         user=self.context['request'].user,
         is_special=True
    )
    teams = [ut.team for ut in user_teams] 
    serializer = UserSerializer(instance=teams, many=True)
    return serializer.data

或者,尝试从数据库中提取更少的内容:

def get_teams(self, obj):

    team_ids = UserTeam.objects.filter(
         user=self.context['request'].user,
         is_special=True
    ).values_list('team_id', flat=True)

    teams = Team.objects.filter(id__in=team_ids) 

    serializer = UserSerializer(instance=teams, many=True)

    return serializer.data

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章