2016-10-17 2 views
0

Существует такой тип контента модель:Невозможно записать правильную фильтрацию 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) 

QuerySets:

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 не должен включать таких пользователей. Теперь, если пользователи играют в «Футбол» и «что-то» с rest_sports, эти пользователи не исключены из users.

Где моя ошибка?

ответ

0

Похоже, что проблема заключалась в логике моих запросов QuerySets. В подходе выше 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 не работает по мере необходимости с сырым QuerySets, потому что на самом деле exclude ничего не исключает. Вот почему я использую , чтобы предоставить пользователям object_id явно.

Смежные вопросы