2017-09-14 81 views
0

我試圖通過它們的'due'字段對對象'Event'進行分組,最後返回一個字典型的字典當天的事件清單。 {'Monday':[SomeEvent,SomeOther]} - 這就是主意。然而在查找事件的due__day我得到:int() argument must be a string, a bytes-like object or a number, not datetime.datetime. 這裏的經理代碼:Django無法查找日期時間字段。 int()參數必須是一個字符串,類似字節的對象或數字,而不是datetime.datetime

# models.py 
class EventManager(models.Manager): 

    def get_week(self, group_object): 
     if datetime.datetime.now().time() > datetime.time(16, 0, 0): 
      day = datetime.date.today() + datetime.timedelta(1) 
     else: 
      day = datetime.date.today() 

     friday = day + datetime.timedelta((4 - day.weekday()) % 7) 
     events = {} 

     while day != friday + datetime.timedelta(1): 
      events[str(day.strftime("%A"))] = self.get_queryset().filter(group=group_object, due__day=day) 
# ^^^ That's where the error happens, from what I understood it tries to convert this datetime to int() to be displayed by template 
      day += datetime.timedelta(1) 

     return events 

這裏是模型:

# models.py 
class Event(models.Model): 
    title = models.CharField(max_length=30) 
    slug = models.SlugField(blank=True) 
    description = models.TextField() 
    subject = models.CharField(max_length=20, choices=SUBJECTS) 
    event_type = models.CharField(max_length=8, choices=EVENT_TYPES) 
    due = models.DateTimeField() 
    author = models.ForeignKey(User, blank=True) 

    group = models.ForeignKey(Group, related_name='events') 

    objects = EventManager() 

我創建了一個模板過濾器來調用這個方法:

@register.filter 
def get_week(group_object): 
    return Event.objects.get_week(group_object=group_object) 

我在event_list.html中調用它(使用索引是因爲它是一個列表視圖,這也只是暫時的,以查看返回的字典是否正確。 )

{{ event_list.0.group|get_week }} 

我的猜測是:我打破了這個奇怪的查找的東西。 .filter(due__day=day)但是我找不到解決方案。

我也試圖尋找due__lte=(day - datetime.timedelta(hours=12)), due__gte=(day + datetime.timedelta(hours=12))這樣的事情,但這不起作用。任何解決方案都非常好,並讚賞。

回答

0

對,所以我的項目解決方案是檢查due__day = day(來自循環中的一個).day < - datetimes屬性比較白天對日期時間不是白天。這對我有用,但它不一定回答這個問題,因爲我不完全是什麼導致了錯誤本身。隨意回答未來SO求助者或者只是我的信息:)

+0

請注意,'.day'只給出數字的月份。如果您的搜索是針對2016年8月12日的某些內容,則該查找將匹配* any *月12日的任何內容,這可能不是您想要的內容。 –

0

這個工作對我來說:

Event.objects.filter(due__gte=datetime.date(2016, 8, 29), due__lt=datetime.date(2016, 8, 30)) 

注意,它使用的date代替日期時間,以避免過多的無關代碼處理時代(這似乎並不重要)。

相關問題