有这样的内容类型模型:
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
之外。
我的错误在哪里?
答案 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
的原因。