Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django ORM查询中使用带有列的timedelta?_Python_Sql_Django_Python 3.x_Orm - Fatal编程技术网

Python 如何在Django ORM查询中使用带有列的timedelta?

Python 如何在Django ORM查询中使用带有列的timedelta?,python,sql,django,python-3.x,orm,Python,Sql,Django,Python 3.x,Orm,我正在使用Django和Python 3.7。我有以下两种型号 class Article(models.Model): ... publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name="articles",) created_on = models.DateTimeField(default=datetime.now) class WebPageStat(model

我正在使用Django和Python 3.7。我有以下两种型号

class Article(models.Model):
    ...
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name="articles",)
    created_on = models.DateTimeField(default=datetime.now)

class WebPageStat(models.Model):
    ...
    publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE, related_name="stats", )

    elapsed_time_in_seconds = models.FloatField(default=0)
    score = models.BigIntegerField(default=0)

class Publisher(models.Model):
   name = models.CharField(max_length=100)

   def __str__(self):
       return self.name
我想写一个Django ORM查询,其中给定一个发布者和以秒为单位的运行时间(一个WebGestat记录),我会找到所有“created_on”日期不早于以秒为单位的运行时间的文章。许多人在其他帖子中建议使用“timedelta”,但这似乎对我不起作用

Article.objects.filter(created_on__lte=datetime.now(timezone.utc) - timedelta(hours=0, minutes=0, seconds=publisher__stats__elapsed_time_in_seconds))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
NameError: name 'publisher__stats__elapsed_time_in_seconds' is not defined
Article.objects.filter(在\uuuLTE=datetime.now(timezone.utc)-timedelta(小时=0,分钟=0,秒=publisher\uuuuuu统计数据\uuuuu已用时间(秒))
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“发布者统计数据已用时间(以秒为单位)”

我可以将timedelta与SQL列逻辑一起使用吗?否则我该怎么做?

根据您的发布者模型,如何定义要与之比较的字段存在问题。你在这个问题上的领域是

publisher\uuuuuu统计数据\uuuu已用时间(以秒为单位)

您的查询代码是

Article.objects.filter(created_on__lte=datetime.now(timezone.utc) - timedelta(hours=0, minutes=0, seconds=publisher__stats__elapsed_time_in_seconds)).
这基本上意味着获取所有创建时间(created_on字段)早于或正好等于article-->publisher-->stats记录的时间(已用_time_in_seconds字段)的文章

这意味着它在stats对象上查找一个
已用时间(以秒为单位)
字段,该字段应通过FK或其他方式与发布者对象相关。发布者对象反过来需要与您的文章对象相关


您的文章模型与发布者模型相关,但发布者和统计数据(?)之间似乎没有关系。您可以检查统计模型以查看字段和关系是否定义正确吗?

这里的根本问题是您不理解为什么会出现错误

name 'publisher__stats__elapsed_time_in_seconds' is not defined`.
让我们再看看代码:

Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
    timedelta(hours=0, minutes=0, seconds=publisher__stats__elapsed_time_in_seconds))
在代码上方的符号
publisher\uuu stats\uuuu exposed\u time\u In\u seconds
被解释为变量引用,该变量引用未在代码中定义。
如果添加

publisher__stats__elapsed_time_in_seconds = 1
就在上面的代码片段之前,您不会得到错误。(你也不会得到你想要的结果。)你期望Django的ORM操作符号
publisher\uuuu stats\uuuu经过的时间(以秒为单位)
,但在Django能够得到它之前,Python解释器必须解释代码,以及代码的编写方式,这只是解释器必须解析的变量名。Django甚至没有机会看到它

好的,防止解释器将名称解释为变量引用,并让Django ORM的进程使用名称的方法是使用。所以你很想这么做:

Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
    timedelta(hours=0, minutes=0, seconds=F("publisher__stats__elapsed_time_in_seconds")))
但随后您将向
timedelta
传递一个它不知道如何处理的参数

正如schillingt在a中指出的那样,其他地方的答案显示了如何将
F()
表达式移到
timedelta
之外。在您的情况下,您可以这样做:

Article.objects.filter(created_on__lte=datetime.now(timezone.utc) -
        timedelta(seconds=1) * F("publisher__stats__elapsed_time_in_seconds"))))

请检查这是否适用于您谢谢您的建议。我查看了您的链接突出显示的答案,但我仍然不清楚为什么会出现“名称未定义”错误。您传递到kwargs以调用
过滤器的值是静态值。引用其他字段的唯一方法是使用
F
实例。您编写的代码是在postgres中创建一个
timedelta
,其中seconds值是联接表中的一列。这很难在ORM中指定,因此需要使用不同的类。不幸的是,您尝试的案例非常复杂,您需要完全改变比较方法,以便能够以不同的方式获得相同的数据。您好,感谢您的回复。这篇文章和WebGestat并没有直接的关系,只是因为它们都有一个“publisher”字段。因此,在普通SQL中,您可以通过该字段进行连接(其中article.publisher=stat.publisher和…)。尽管如此,我还是对您的建议进行了一次尝试,但是它导致了一个错误,“NameError:name'publisher\uuuuuu stats\uuuuu expressed\u time\u inuu seconds”未定义。