Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.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选择不接收仅接收基于实列计算的值的表字段?_Python_Mysql_Django_Django Models_Django Orm - Fatal编程技术网

Python 是否可以使用Django ORM选择不接收仅接收基于实列计算的值的表字段?

Python 是否可以使用Django ORM选择不接收仅接收基于实列计算的值的表字段?,python,mysql,django,django-models,django-orm,Python,Mysql,Django,Django Models,Django Orm,所以问题是“是否可以在没有原始语句的情况下使用Django ORM进行以下查询?” 从我的角度来看,这个例子是合适的: 我们有一个模型: class MyOperations(models.Model): operation_start_time = models.DateTimeField() 在某个时刻,我们创建了一条记录,并将字段值设置为Now(或者我们更新了一些现有记录。这无关紧要): 现在我们想知道已经过去了多少时间。我希望Django ORM生成以下SQL语句来从数据库请求

所以问题是“是否可以在没有原始语句的情况下使用Django ORM进行以下查询?”

从我的角度来看,这个例子是合适的:

我们有一个模型:

class MyOperations(models.Model):
    operation_start_time = models.DateTimeField()
在某个时刻,我们创建了一条记录,并将字段值设置为
Now
(或者我们更新了一些现有记录。这无关紧要):

现在我们想知道已经过去了多少时间。我希望Django ORM生成以下SQL语句来从数据库请求数据(假设我们使用MySQL后端):

那么,这是一种不用原始语句就能实现的方法吗

SELECT
 my_table.column_a + my_table.column_b
FROM
 my_table
目前,我决定采用以下解决方案:

MyOperations.objects.values('operation_start_time').annotate(
    diff=ExpressionWrapper(functions.Now() - F('operation_start_time'),
    output_field=DurationField()
)).filter(...)
它生成以下SQL语句:

SELECT
 `myapp_myoperations`.`operation_start_time`,
 TIMESTAMPDIFF(MICROSECOND, `myapp_myoperations`.`operation_start_time`, CURRENT_TIMESTAMP) AS `time_spent`
FROM
 `myapp_myoperations`
WHERE ...
或者在Python响应对象表示中:

{'operation_start_time': datetime(...), 'diff': timedelta(...)}
因为这是我唯一感兴趣的领域,所以这是一种只使用
diff
获取响应dict的方法吗? Django ORM生成了一个查询,它请求
操作\u开始时间
,就像我们写的那样。但如果我删除对
values
的调用,它将生成请求所有表列的查询

产生预期SQL的解决方案

我们应该将对
values
的调用放到查询已知的
diff
位置

MyOperations.objects.annotate(
    diff=ExpressionWrapper(functions.Now() - F('operation_start_time'),
    output_field=DurationField()
)).values('diff').filter(...)
您可以在计算字段上使用
values()
,因此

MyOperations.objects.values('operation_start_time').annotate(
    diff=ExpressionWrapper(functions.Now() - F('operation_start_time'),
    output_field=DurationField()
)).values('diff')
应该给您一个结果查询集,该查询集只包含计算的“差异”。

您可以在计算字段上使用
values()

MyOperations.objects.values('operation_start_time').annotate(
    diff=ExpressionWrapper(functions.Now() - F('operation_start_time'),
    output_field=DurationField()
)).values('diff')

应该给您一个结果查询集,其中只包含您计算的“差异”。

是,但是我建议您添加一个别名,这样您就可以知道结果列的名称,比如
选择my_table.column\u a+my_table.column\u b作为总计…..
@RiggsFolly,那么您能提供一个Django代码的示例来实现这一点吗?我不明白您到底想要什么。您说,如果删除对
values
is的调用,将生成错误的查询,那么到底是什么错误呢?实际上,您正在为表中的每一行查询
diff
。你不想那样吗?你描述的第一个问题和最后一个问题有什么关系?首先,您询问是否可以执行列a+列b(并通过演示如何使用
F()
表达式来回答这个问题),然后您询问如何仅获取
diff
(您还可以通过删除
值()
调用来告诉我们)最后你说你想要别的东西,但不是什么…@dirkgroten删除对
值的调用将生成选择所有列的SQL。这是从DB到应用程序的不必要的数据传输。请查看已接受的答案或原始问题的编辑。我将把最终的解决方案放在那里,产生预期的queryOk。根据你的问题是如何表述的,我希望你知道
的作用,并且已经尝试添加
值('diff')
。调用
值('operation\u start\u time')
实际上是按该值分组的,这意味着如果两行包含相同的开始时间,它将只选择其中一行。是,但是我建议您添加一个别名,这样您就可以知道结果列的名称,比如
选择my_table.column\u a+my_table.column\u b作为总计…..
@RiggsFolly,那么您能提供一个Django代码的示例来实现这一点吗?我不明白您到底想要什么。您说,如果删除对
values
is的调用,将生成错误的查询,那么到底是什么错误呢?实际上,您正在为表中的每一行查询
diff
。你不想那样吗?你描述的第一个问题和最后一个问题有什么关系?首先,您询问是否可以执行列a+列b(并通过演示如何使用
F()
表达式来回答这个问题),然后您询问如何仅获取
diff
(您还可以通过删除
值()
调用来告诉我们)最后你说你想要别的东西,但不是什么…@dirkgroten删除对
值的调用将生成选择所有列的SQL。这是从DB到应用程序的不必要的数据传输。请查看已接受的答案或原始问题的编辑。我将把最终的解决方案放在那里,产生预期的queryOk。根据你的问题是如何表述的,我希望你知道
的作用,并且已经尝试添加
值('diff')
。调用
值('operation\u start\u time')
实际上是按该值分组的,这意味着如果两行包含相同的开始时间,它将只选择其中一行。太棒了!这正是我所期望的问题。顺便说一句:我们甚至不需要第一次调用
值。因此,我将把问题本身的最终解决方案,因为我没有使用注释中的代码格式太棒了!这正是我所期望的问题。顺便说一句:我们甚至不需要第一次调用
值。因此,我将给出问题本身的最终解决方案,因为我没有在注释中使用代码格式
MyOperations.objects.values('operation_start_time').annotate(
    diff=ExpressionWrapper(functions.Now() - F('operation_start_time'),
    output_field=DurationField()
)).values('diff')