这是我的数据模型:
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)
当我查询所有用户时,我得到这样的结果(rest 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
但是我仍然得到相同的结果... 有什么想法或建议吗?
谢谢!
答案 0 :(得分:1)
您可以从穿透表中获得更大的成功。
我还没有测试过,这不是最佳性能,但是:
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