【问题标题】:DRF - filter list by DateFieldDRF - 按日期字段过滤列表
【发布时间】:2015-12-15 19:09:15
【问题描述】:

我有一个Ride模型:

class Ride(models.Model):
    driver = models.ForeignKey('auth.User', related_name='rides_as_driver')
    destination=models.ForeignKey(Destination, related_name='rides_as_final_destination')
    leaving_time=models.TimeField()
    leaving_date=models.DateField(default=datetime.date.today)
    num_of_spots=models.IntegerField()
    passengers=models.ManyToManyField('auth.User', related_name="rides_as_passenger")
    mid_destinations=models.ManyToManyField(Destination, related_name='rides_as_middle_destination')

我正在尝试按今天的日期过滤 rides_as_driver 字段:

def get(self, request):
        user=self.request.user
        driverRides = user.rides_as_driver.filter(leaving_time=datetime.date.today)

过滤器行抛出异常,说:

RemovedInDjango19Warning: Passing callable arguments to queryset is deprecated.
  value, lookups, used_joins = self.prepare_lookup_value(value, lookups, can_reuse, allow_joins)

我也试过 get:driverRides = user.rides_as_driver.get(leaving_time=datetime.date.today),没用。

如何按字段值过滤对象列表?

谢谢!

【问题讨论】:

    标签: python date filter django-rest-framework django-filter


    【解决方案1】:

    首先,leaving_time 是一个 TimeField,它存储 datetime.time 值,而您尝试通过 datetime.datetime 对象进行过滤。您的代码中有leaving_date,显然您应该使用它来过滤。

    其次,错误表明您正在传递一个函数 (datetime.date.today) 作为过滤器参数和 this is dropped in Django 1.9。

    所以你想做的是:

    driverRides = user.rides_as_driver.get(leaving_date=datetime.datetime.now().date())
    

    如果您必须在应用程序中处理来自多个时区的用户,请查看documentation on Time zones。

    【讨论】:

    • 感谢您的回答。我试图将其更改为 datetime.date.today(),它抛出了一个异常,说“exception_value” - 预期的字符串或缓冲区
    • 这是因为 datetime.date.today() 返回 datetime.datetime 和 TimeField 存储 datetime.time 值。你需要datetime.datetime.now().time()。
    • 现在它会抛出异常,提示“不存在行程匹配查询”,但我确实有今天的日期。我认为问题在于 datetime.datetime.now().time() 既是日期又是时间。 Ride中的leave_time字段是DateField类型,我想获得今天的游乐设施,与时间无关。
    • 实际上在您的代码中是leaving_time=models.TimeField()。您还拥有leaving_date=models.DateField(default=datetime.date.today),如果您想在某一天乘车,显然必须对其进行过滤。这两点仍然成立:您必须将正确函数的 result 传递给您的过滤器。
    • 哈哈傻了我,一直以来我都以为我比较了leave_date,我把它弄错了!它确实适用于 datetime.date.today(),谢谢!
    猜你喜欢
    • 2019-05-31
    • 2020-05-25
    • 1970-01-01
    • 2022-06-11
    • 2020-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多