2013-02-20 2 views
2

Допустим, я сделать следующий запрос:объект Изменить Джанго QuerySet после того, как он был создан

showtimes = ShowTime.objects.filter(
    start_date__lte=start, 
    end_date__gte=end, 
    movie__slug=movie.slug, 
    city=city, 
    visible=1) 

Теперь я хочу иметь функцию, которая принимает в этом queryset object и фильтрует результаты дополнительно на основе некоторых других атрибутов, что-то вроде этого:

def is_subtitled_3d(showtimes): 
    return (
     showtimes.language == LANGUAGE_SUBTITLED and 
     showtimes.type_vip == None and 
     showtimes.type_3d == 1 and 
     showtimes.type_gtmax == None and 
     showtimes.type_xd == None) 

Возможно, что-то подобное для изменения объекта или есть другой способ сделать это?

ответ

3

querysets являются lazy and chainable

вы можете фильтровать showtimes столько раз, сколько вам нравится. Я не верю, что ваш синтаксис является правильным, но вы можете использовать стандартный filter сохранить фильтр в QuerySet

def is_subtitled_3d(showtimes): 
    return showtimes.filter(
    language=LANGUAGE_SUBTITLED,   
    type_vip__isnull=True, 
    type_3d=1, 
    type_gtmax__isnull=True, 
    type_xd__isnull=True 
) 

может быть, если пользователь хочет, чтобы фильтровать 3D фильмов, чтобы показать, как вы можете комбинировать фильтры, что-то вроде:

showtimes = ShowTime.objects.filter(
    start_date__lte=start, 
    end_date__gte=end, 
    movie__slug=movie.slug, 
    city=city, 
    visible=1) 

if request.GET.get('is_3d_movie'): 
    showtimes = showtimes.filter(type_3d=1) 
etc... 
+0

Это замечательно, именно то, что мне нужно, спасибо за включение ссылки на документацию. – edu222

+0

Кстати, использует 'is__null' лучшую практику, чем использование' == None'? – edu222

+1

@ edu222 hmm Я не знаю, что именно '= None', но' isnull' переведет ваш запрос в 'IS NULL'. https://docs.djangoproject.com/ru/dev/ref/models/querysets/#std:fieldlookup-isnull – dm03514

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