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

时间:2016-10-17 18:55:47

标签: django django-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不应包括这样的用户。现在,如果用户同时播放“足球”和“{1}}”中的某些内容,则不会将这些用户排除在rest_sports之外。

我的错误在哪里?

2 个答案:

答案 0 :(得分:0)

click

答案 1 :(得分:0)

似乎问题出在我的QuerySet的逻辑上。在上述方法中,查询集仅排除了用户的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似乎无法根据需要使用原始QuerySet,因为exclude实际上不会排除任何内容。这就是为什么我使用values_list('object_id', flat=True)来明确提供用户object_id的原因。