无法编写正确的过滤查询集

Can not write proper filtering queryset

有这样的内容类型模型:

class CTModel(models.Model):
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')

    sport = models.ForeignKey(SportTypes)

查询集:

user_type = ContentType.objects.get_for_model(UserProfile)
current_sport = Sports.objects.get(name='Football')
rest_sports = Sports.objects.filter(name__in=RANDOM LIST OF GAMES).exclude(name='Football')

# Here I want to get all users who play 'Football'
users_play_football = CTModel.objects.filter(content_type=user_type, sport=current_sport)

# Here I want to get all users, who play Football,
# but at the same time, does not play any other games from 'rest_sports'
users = users_play_football.exclude(sport=rest_sports)

我想获得 users 一些内容(用户),以防万一用户玩 只是 足球,如果用户玩任何其他游戏,users 不应包括此类用户。现在,如果用户同时玩 'Football' 和来自 rest_sports 的东西,这些用户不会被排除在 users.

之外

我的错误在哪里?

users = users_play_football.exclude(sport__in=rest_sports)

看来问题出在我的查询集的逻辑上。在上面的方法中,查询集只排除了用户的 rest_sports,并没有从 users.

中删除用户本身

这里有一个解决方案:

users_play_football = CTModel.objects.filter(content_type=user_type, sport=current_sport).values_list('object_id', flat=True)
users_w_rest_games = CTModel.objects.filter(content_type=user_type, sport=rest_sports).values_list('object_id', flat=True)

if users_w_rest_games:
    users = users_play_football.exclude(object_id__in=users_w_rest_games)
else:
    users = users_play_football

在我的例子中,.exclude 似乎不能按需要使用原始查询集,因为 exclude 实际上不排除任何东西。这就是为什么我使用 values_list('object_id', flat=True) 来明确提供用户的 object_id 的原因。