2013-02-18 2 views
2

У меня есть эта модель:GAE хранилищу: фильтр по дате интервала

class Vehicle(db.Model): 
    ... 
    start_production_date = db.DateProperty() 
    end_production_date = db.DateProperty() 

Мне нужно фильтровать, например, все транспортные средства в производство, скажем, в 2010 году:

Я думал, что я мог бы сделать:

q = (Vehicle.all() 
    .filter('start_production_date >=', datetime(2010, 1, 1)) 
    .filter('end_production_date <', datetime(2011, 1, 1))) 

купить я BadFilterError:

BadFilterError: invalid filter: Only one property per query may have inequality filters (<=, >=, <, >).. 

так, как мне это получить? Более того, это мне кажется довольно общей задачей.

ответ

2

Я пошел с этим раствор:

Я установил в модели a ListProperty элемент, содержащий все годы, когда была изготовлена ​​модель:

vhl.production_years = range(start_production_date.year, end_production_date + 1) 

Тогда тест:

q = (Vehicle.all() 
    .filter('production_years =', 2010)) 
2

Один из подходов заключается в изменении модели, чтобы что-то вроде этого:

class Vehicle(db.Model): 
    ... 
    start_production_date = db.DateProperty() 
    start_production_year = db.IntegerProperty() 
    start_production_month = db.IntegerProperty() 
    start_production_day = db.IntegerProperty() 

    end_production_date = db.DateProperty() 
    end_production_year = db.IntegerProperty() 
    end_production_month = db.IntegerProperty() 
    end_production_day = db.IntegerProperty() 

Update эти новые значения на каждом сайте (вы могли override put) и просто:

# specific year 

q = (Vehicle.all() 
    .filter('start_production_year =', 2010)) 

# specific year, different months 

q = (Vehicle.all() 
    .filter('start_production_year =', 2010) 
    .filter('start_production_month IN', [1, 2, 3, 4])) 

# different years 

q = (Vehicle.all() 
    .filter('start_production_year IN', [2010, 2011, 2012])) 
+0

Извините, но это не решает проблему: как я фильтровать модели в производство в 2010 году? этот год ** между ** начало и конец. Например, есть модели, которые начали строиться в 2000 году и в 2012 году вышли из производства и т. Д. – neurino

+0

@neurino вы можете создать эти списки вручную, а затем использовать оператор 'IN'. Например, если 'start_list = [2000, 2001, 2002, 2003, 2004]' и 'end_list = [2009, 20010, 20011, 20012, 2013]' вы можете использовать два фильтра: '.filter ('start_production_year IN' start_list) .filter ('end_production_year IN', end_list) ' – Lipis

+0

@neurino Я не уверен, что вы можете найти что-нибудь лучше .. так как вам не разрешено использовать два оператора неравенства в одном и том же фильтре. – Lipis