2015-09-23 95 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-10end_date = 2015-09-16那本書被接受。同樣如果s tart_date = 2015-09-16end_date = 2015-09-28

我可以做這樣的事情:

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

如果我能以某種方式循環它有開始和結束日期,將工作之間的所有日期問答對象。那可能嗎?

我知道有大於/小於過濾器,但從我看過的例子,將在字段中的單數值而不是值的列表。

編輯: 我也試過這樣:

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-16end_date = 2015-09-28之間的書,說:「字符串日期」都沒有的「['2015-09-15', '2015-09-27']

子瞭解更多關於here包含Django的過濾器。