Django ORM - 查询取决于通过 table
Django ORM - query depending on through table
这是我的数据模型:
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)
当我查询所有用户时,我得到这样的结果(json 结果为其余 api:
{
'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
但我仍然得到相同的结果...
有什么想法或建议吗?
谢谢!
从 table 开始,您可能会取得更大的成功。
我还没有测试过,这不是最佳性能,但是:
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
或者,尝试从 DB 中提取更少的内容:
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
这是我的数据模型:
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)
当我查询所有用户时,我得到这样的结果(json 结果为其余 api:
{
'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
但我仍然得到相同的结果... 有什么想法或建议吗?
谢谢!
从 table 开始,您可能会取得更大的成功。
我还没有测试过,这不是最佳性能,但是:
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
或者,尝试从 DB 中提取更少的内容:
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