这是我的数据模型:
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] 删除。
我来说两句