无法编写正确的过滤查询集
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
的原因。
有这样的内容类型模型:
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
的原因。