Django视图对象过滤器使用timezone.now()。date或timezone.now()。time->期望的字符串或字节对象

时间:2017-08-15 09:53:52

标签: python django object filter timezone

您好我有一些Django 11项目,我的模型看起来像

class Event(models.Model):
    name = models.CharField(max_length=100, unique=True)
    title = models.CharField(max_length=100)
    info = models.CharField(max_length=100)
    image = models.ImageField(upload_to='events/%Y/%m/%d')
    start_date = models.DateField(default=timezone.now)
    start_time = models.TimeField(default=timezone.now)
    stop_date = models.DateField(default=timezone.now)
    stop_time = models.TimeField(default=timezone.now)

    place = models.ForeignKey('places.Place', on_delete=models.CASCADE)
    company = models.ForeignKey('companies.Company', on_delete=models.CASCADE)

我的观点看起来像

def place_website(request, place_id):

    place_template = get_template('room.html')

    place_obj = Place.objects.filter(id=place_id)

    # filter for event obejts only for requested place, filtered for now and next events
    place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date)

    place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now(), stop_date__gte=timezone.now()).order_by('start_time')

    place_context = {
        'place_obj': place_obj,
        'place_event_now': place_event_now,
        'place_events_next': place_events_next,
    }

    return HttpResponse(place_template.render(place_context))

我想要管理的是根据时间传递过滤的Event对象列表。

让我们选择这一行

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date)

它错误"期望字符串或字节类对象"但当我删除"。日期"来自" timezone.now()"错误消失(然后过滤器什么也不做)但我想比较日期和时间的日期。

如何正确地做到这一点?

这种在视图中而不是在模板中过滤对象的方法是否正确?

######更新########

它的werid因为在修正后现在我没有错误但是查询集没有正确过滤,看起来只有两个第一个参数正在过滤ok而另外两个是导致空查询集。

place_event_now = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), start_time__lte=timezone.now().strftime('%H:%M:%S'), stop_time__gte=timezone.now().strftime('%H:%M:%S'))

我的数据库时间以 H:M:S 和timezone.now()格式保存.time()具有不同的格式,因此我使用 .strftime 修改了过滤器这没有帮助,我不会限制" place_event_now "查询到特定对象/对象,条件 start_time<当前时间< STOP_TIME

另一种情况是 place_event_next

place_events_next = Event.objects.filter(place=place_id, start_date=timezone.now().strftime('%Y-%m-%d'), stop_date__gte=timezone.now().strftime('%Y-%m-%d'), start_time__gt=timezone.now().strftime('%H:%M:%S')).order_by('start_time')

当我过滤 start_time 大于 timezone.now()的对象时,它们仍在查询集中。

我做错了吗?

2 个答案:

答案 0 :(得分:0)

您可能需要致电datedate() 取代

filter(place=place_id, start_date=timezone.now().date, stop_date__gte=timezone.now().date)
#                                                  ^^^                                 ^^^

filter(place=place_id, start_date=timezone.now().date(), stop_date__gte=timezone.now().date())
#                                                  ^^^                                 ^^^

答案 1 :(得分:0)

我认为 timezone.now()的返回时间不在我当前的时区,我将其更改为 timezone.localtime(),一切正常! !