2015-09-23 6 views
0

У меня есть модель книги с weeks_list поле, которое хранит несколько дат в виде строк в списке:модели Фильтрация по значениям в пределах списка

['2015-09-15', '2015-09-27'] 

В моем views.py файл я хочу, чтобы иметь возможность, учитывая дату начала и дату окончания (в том же формате), чтобы фильтровальные книги были только те, у которых по крайней мере одна из их дат в поле weeks_list находилась между данными значениями.

например. если книга имеет weeks_list поле:

['2015-09-15', '2015-09-27'] 

Тогда, если у меня есть start_date = 2015-09-10 и end_date = 2015-09-16, что книга принята. То же самое, если s tart_date = 2015-09-16 и end_date = 2015-09-28.

я могу сделать что-то вроде этого:

allbooks = Book.objects.filter(Q(weeks_list__contains=start_date)|Q(weeks_list__contains='2015-09-27')) 

И если бы я мог каким-то образом кольцую иметь объект Q для всех дат между даты начала и окончания, которые будут работать. Это возможно?

Я знаю, что есть больше или меньше фильтров, но из примеров, на которые я смотрел, будет работать на сингулярном значении в поле, а не в списке значений.

EDIT: Я также попытался это:

allbooks = Book.objects.all() 
q=Q(weeks_list__contains='2015-09-12') 
q = q.add((Q(weeks_list__contains='2015-09-15')), q.connector) 
allbooks = allbooks.filter(q) 

Но это не работает. Можно ли сделать третью строку выражением «или»?

Это модель:

class Book(models.Model): 
title = models.CharField(max_length=200) 
author = models.CharField(max_length=200) 
rating = models.CharField(max_length=5) 
genre = models.CharField(max_length=200) 
NYT_image_url = models.CharField(max_length=200) 
GR_image_url = models.CharField(max_length=200) 
isbns = models.TextField(max_length=600) 
weekly_rank = models.TextField(max_length=1000) 
weeks_list = models.TextField(max_length=1000) 
goodreads_ID = models.CharField(max_length=25) 
goodreads_URL = models.CharField(max_length = 100) 
NYT_description = models.TextField(max_length = 500) 

EDIT2: Я нашел решение, я должен использовать q.or вместо q.connector. Не знаете, как это отметить.

+0

Почему бы вам не показать нам свою модель? – ozgur

ответ

0

У вас нет списка дат («weeks_list»), у вас есть текстовое поле, вы должны указать даты как dateField's, а не TextField.

Используя contains в запросе, вы спрашиваете, является ли string подстрокой o другой.

Потому что, если вы запрашиваете книги между этой start_date = 2015-09-16 и end_date = 2015-09-28, что «строки датой» не подстрока «['2015-09-15', '2015-09-27']»

Подробнее here о содержит Джанго фильтра.

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