2017-09-14 44 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代替日期时间,以避免过多的无关代码处理时代(这似乎并不重要)。

相关问题