“Django/docs/2.2.x/ref/models/database-functions”的版本间差异

来自菜鸟教程
Django/docs/2.2.x/ref/models/database-functions
跳转至:导航、​搜索
(autoload)
 
(Page commit)
 
第1行: 第1行:
 +
{{DISPLAYTITLE:数据库函数 — Django 文档}}
 
<div id="module-django.db.models.functions" class="section">
 
<div id="module-django.db.models.functions" class="section">
  
 
<span id="database-functions"></span>
 
<span id="database-functions"></span>
= Database Functions =
+
= 数据库函数 =
  
The classes documented below provide a way for users to use functions provided
+
下面记录的类为用户提供了一种使用底层数据库提供的函数作为 Django 中的注释、聚合或过滤器的方法。 函数也是[[../expressions|表达式]],因此它们可以与[[../querysets#aggregation-functions|聚合函数]]等其他表达式结合使用。
by the underlying database as annotations, aggregations, or filters in Django.
 
Functions are also [[../expressions|<span class="doc">expressions</span>]], so they can be used and
 
combined with other expressions like [[../querysets#aggregation-functions|<span class="std std-ref">aggregate functions</span>]].
 
  
We'll be using the following model in examples of each function:
+
我们将在每个函数的示例中使用以下模型:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第15行: 第13行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>class Author(models.Model):
+
<syntaxhighlight lang="python">class Author(models.Model):
 
     name = models.CharField(max_length=50)
 
     name = models.CharField(max_length=50)
 
     age = models.PositiveIntegerField(null=True, blank=True)
 
     age = models.PositiveIntegerField(null=True, blank=True)
 
     alias = models.CharField(max_length=50, null=True, blank=True)
 
     alias = models.CharField(max_length=50, null=True, blank=True)
     goes_by = models.CharField(max_length=50, null=True, blank=True)</pre>
+
     goes_by = models.CharField(max_length=50, null=True, blank=True)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
We don't usually recommend allowing <code>null=True</code> for <code>CharField</code> since this
+
我们通常不建议为 <code>CharField</code> 允许 <code>null=True</code>,因为这允许该字段有两个“空值”,但这对于下面的 <code>Coalesce</code> 示例很重要。
allows the field to have two &quot;empty values&quot;, but it's important for the
 
<code>Coalesce</code> example below.
 
  
 
<div id="comparison-and-conversion-functions" class="section">
 
<div id="comparison-and-conversion-functions" class="section">
  
 
<span id="comparison-functions"></span>
 
<span id="comparison-functions"></span>
== Comparison and conversion functions ==
+
== 比较和转换函数 ==
  
 
<div id="cast" class="section">
 
<div id="cast" class="section">
  
=== <code>Cast</code> ===
+
=== Cast ===
  
; ''class'' <code>Cast</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/comparison.html#Cast|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Cast</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Forces the result type of <code>expression</code> to be the one from <code>output_field</code>.
+
强制 <code>expression</code> 的结果类型为 <code>output_field</code> 中的结果类型。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第48行: 第44行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Cast
+
>>> from django.db.models.functions import Cast
&gt;&gt;&gt; Author.objects.create(age=25, name='Margaret Smith')
+
>>> Author.objects.create(age=25, name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(
+
>>> author = Author.objects.annotate(
 
...    age_as_float=Cast('age', output_field=FloatField()),
 
...    age_as_float=Cast('age', output_field=FloatField()),
 
... ).get()
 
... ).get()
&gt;&gt;&gt; print(author.age_as_float)
+
>>> print(author.age_as_float)
25.0</pre>
+
25.0</syntaxhighlight>
  
 
</div>
 
</div>
第64行: 第60行:
 
<div id="coalesce" class="section">
 
<div id="coalesce" class="section">
  
=== <code>Coalesce</code> ===
+
=== Coalesce ===
  
; ''class'' <code>Coalesce</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/comparison.html#Coalesce|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Coalesce</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a list of at least two field names or expressions and returns the
+
接受至少包含两个字段名称或表达式的列表,并返回第一个非空值(请注意,空字符串不被视为空值)。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。
first non-null value (note that an empty string is not considered a null
 
value). Each argument must be of a similar type, so mixing text and numbers
 
will result in a database error.
 
  
Usage examples:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第80行: 第73行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; # Get a screen name from least to most public
+
<syntaxhighlight lang="python">>>> # Get a screen name from least to most public
&gt;&gt;&gt; from django.db.models import Sum, Value as V
+
>>> from django.db.models import Sum, Value as V
&gt;&gt;&gt; from django.db.models.functions import Coalesce
+
>>> from django.db.models.functions import Coalesce
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith', goes_by='Maggie')
+
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
&gt;&gt;&gt; author = Author.objects.annotate(
+
>>> author = Author.objects.annotate(
 
...    screen_name=Coalesce('alias', 'goes_by', 'name')).get()
 
...    screen_name=Coalesce('alias', 'goes_by', 'name')).get()
&gt;&gt;&gt; print(author.screen_name)
+
>>> print(author.screen_name)
 
Maggie
 
Maggie
  
&gt;&gt;&gt; # Prevent an aggregate Sum() from returning None
+
>>> # Prevent an aggregate Sum() from returning None
&gt;&gt;&gt; aggregated = Author.objects.aggregate(
+
>>> aggregated = Author.objects.aggregate(
 
...    combined_age=Coalesce(Sum('age'), V(0)),
 
...    combined_age=Coalesce(Sum('age'), V(0)),
 
...    combined_age_default=Sum('age'))
 
...    combined_age_default=Sum('age'))
&gt;&gt;&gt; print(aggregated['combined_age'])
+
>>> print(aggregated['combined_age'])
 
0
 
0
&gt;&gt;&gt; print(aggregated['combined_age_default'])
+
>>> print(aggregated['combined_age_default'])
None</pre>
+
None</syntaxhighlight>
  
 
</div>
 
</div>
第105行: 第98行:
 
警告
 
警告
  
A Python value passed to <code>Coalesce</code> on MySQL may be converted to an
+
除非显式转换为正确的数据库类型,否则在 MySQL 上传递给 <code>Coalesce</code> 的 Python 值可能会转换为不正确的类型:
incorrect type unless explicitly cast to the correct database type:
 
  
 
<div class="doctest highlight-default notranslate">
 
<div class="doctest highlight-default notranslate">
第112行: 第104行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import DateTimeField
+
<syntaxhighlight lang="python">>>> from django.db.models import DateTimeField
&gt;&gt;&gt; from django.db.models.functions import Cast, Coalesce
+
>>> from django.db.models.functions import Cast, Coalesce
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; now = timezone.now()
+
>>> now = timezone.now()
&gt;&gt;&gt; Coalesce('updated', Cast(now, DateTimeField()))</pre>
+
>>> Coalesce('updated', Cast(now, DateTimeField()))</syntaxhighlight>
  
 
</div>
 
</div>
第127行: 第119行:
 
<div id="greatest" class="section">
 
<div id="greatest" class="section">
  
=== <code>Greatest</code> ===
+
=== Greatest ===
  
; ''class'' <code>Greatest</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/comparison.html#Greatest|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Greatest</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a list of at least two field names or expressions and returns the
+
接受至少包含两个字段名称或表达式的列表并返回最大值。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。
greatest value. Each argument must be of a similar type, so mixing text and
 
numbers will result in a database error.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第142行: 第132行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>class Blog(models.Model):
+
<syntaxhighlight lang="python">class Blog(models.Model):
 
     body = models.TextField()
 
     body = models.TextField()
 
     modified = models.DateTimeField(auto_now=True)
 
     modified = models.DateTimeField(auto_now=True)
第151行: 第141行:
 
     blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
 
     blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
  
&gt;&gt;&gt; from django.db.models.functions import Greatest
+
>>> from django.db.models.functions import Greatest
&gt;&gt;&gt; blog = Blog.objects.create(body='Greatest is the best.')
+
>>> blog = Blog.objects.create(body='Greatest is the best.')
&gt;&gt;&gt; comment = Comment.objects.create(body='No, Least is better.', blog=blog)
+
>>> comment = Comment.objects.create(body='No, Least is better.', blog=blog)
&gt;&gt;&gt; comments = Comment.objects.annotate(last_updated=Greatest('modified', 'blog__modified'))
+
>>> comments = Comment.objects.annotate(last_updated=Greatest('modified', 'blog__modified'))
&gt;&gt;&gt; annotated_comment = comments.get()</pre>
+
>>> annotated_comment = comments.get()</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
<code>annotated_comment.last_updated</code> will be the most recent of <code>blog.modified</code>
+
<code>annotated_comment.last_updated</code> 将是 <code>blog.modified</code> <code>comment.modified</code> 中最新的。
and <code>comment.modified</code>.
 
  
 
<div class="admonition warning">
 
<div class="admonition warning">
第167行: 第156行:
 
警告
 
警告
  
The behavior of <code>Greatest</code> when one or more expression may be <code>null</code>
+
当一个或多个表达式可能是 <code>null</code> 时,<code>Greatest</code> 的行为因数据库而异:
varies between databases:
 
  
* PostgreSQL: <code>Greatest</code> will return the largest non-null expression, or <code>null</code> if all expressions are <code>null</code>.
+
* PostgreSQL: <code>Greatest</code> 将返回最大的非空表达式,如果所有表达式都是 <code>null</code>,则返回 <code>null</code>
* SQLite, Oracle, and MySQL: If any expression is <code>null</code>, <code>Greatest</code> will return <code>null</code>.
+
* SQLite、Oracle 和 MySQL:如果任何表达式为 <code>null</code>,则 <code>Greatest</code> 将返回 <code>null</code>
  
The PostgreSQL behavior can be emulated using <code>Coalesce</code> if you know
+
如果您知道要作为默认值提供的合理最小值,则可以使用 <code>Coalesce</code> 模拟 PostgreSQL 行为。
a sensible minimum value to provide as a default.
 
  
  
第182行: 第169行:
 
<div id="least" class="section">
 
<div id="least" class="section">
  
=== <code>Least</code> ===
+
=== Least ===
  
; ''class'' <code>Least</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/comparison.html#Least|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Least</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a list of at least two field names or expressions and returns the
+
接受至少包含两个字段名称或表达式的列表并返回最小值。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。
least value. Each argument must be of a similar type, so mixing text and numbers
 
will result in a database error.
 
  
 
<div class="admonition warning">
 
<div class="admonition warning">
第195行: 第180行:
 
警告
 
警告
  
The behavior of <code>Least</code> when one or more expression may be <code>null</code>
+
当一个或多个表达式可能是 <code>null</code> 时,<code>Least</code> 的行为因数据库而异:
varies between databases:
 
  
* PostgreSQL: <code>Least</code> will return the smallest non-null expression, or <code>null</code> if all expressions are <code>null</code>.
+
* PostgreSQL: <code>Least</code> 将返回最小的非空表达式,如果所有表达式都是 <code>null</code>,则返回 <code>null</code>
* SQLite, Oracle, and MySQL: If any expression is <code>null</code>, <code>Least</code> will return <code>null</code>.
+
* SQLite、Oracle 和 MySQL:如果任何表达式为 <code>null</code>,则 <code>Least</code> 将返回 <code>null</code>
  
The PostgreSQL behavior can be emulated using <code>Coalesce</code> if you know
+
如果您知道要提供的合理最大值作为默认值,则可以使用 <code>Coalesce</code> 模拟 PostgreSQL 行为。
a sensible maximum value to provide as a default.
 
  
  
第210行: 第193行:
 
<div id="nullif" class="section">
 
<div id="nullif" class="section">
  
=== <code>NullIf</code> ===
+
=== NullIf ===
  
; ''class'' <code>NullIf</code><span class="sig-paren">(</span>''<span class="n">expression1</span>'', ''<span class="n">expression2</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/comparison.html#NullIf|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">NullIf</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression1</span></span>'', ''<span class="n"><span class="pre">expression2</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.2 版中的新功能。</span>
  
  
 
</div>
 
</div>
Accepts two expressions and returns <code>None</code> if they are equal, otherwise
+
接受两个表达式,如果相等则返回 <code>None</code>,否则返回 <code>expression1</code>
returns <code>expression1</code>.
 
  
 
<div class="admonition-caveats-on-oracle admonition">
 
<div class="admonition-caveats-on-oracle admonition">
  
Caveats on Oracle
+
关于 Oracle 的注意事项
  
Due to an [[../../databases#oracle-null-empty-strings|<span class="std std-ref">Oracle convention</span>]], this
+
由于 [[../../databases#oracle-null-empty-strings|Oracle 约定]] ,当表达式的类型为 [[../fields#django.db.models|CharField]] 时,此函数返回空字符串而不是 <code>None</code>
function returns the empty string instead of <code>None</code> when the expressions
 
are of type [[../fields#django.db.models|<code>CharField</code>]].
 
  
Passing <code>Value(None)</code> to <code>expression1</code> is prohibited on Oracle since
+
Oracle 禁止将 <code>Value(None)</code> 传递给 <code>expression1</code>,因为 Oracle 不接受 <code>NULL</code> 作为第一个参数。
Oracle doesn't accept <code>NULL</code> as the first argument.
 
  
  
第243行: 第223行:
  
 
<span id="id1"></span>
 
<span id="id1"></span>
== Date functions ==
+
== 日期函数 ==
  
We'll be using the following model in examples of each function:
+
我们将在每个函数的示例中使用以下模型:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第251行: 第231行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>class Experiment(models.Model):
+
<syntaxhighlight lang="python">class Experiment(models.Model):
 
     start_datetime = models.DateTimeField()
 
     start_datetime = models.DateTimeField()
 
     start_date = models.DateField(null=True, blank=True)
 
     start_date = models.DateField(null=True, blank=True)
第257行: 第237行:
 
     end_datetime = models.DateTimeField(null=True, blank=True)
 
     end_datetime = models.DateTimeField(null=True, blank=True)
 
     end_date = models.DateField(null=True, blank=True)
 
     end_date = models.DateField(null=True, blank=True)
     end_time = models.TimeField(null=True, blank=True)</pre>
+
     end_time = models.TimeField(null=True, blank=True)</syntaxhighlight>
  
 
</div>
 
</div>
第264行: 第244行:
 
<div id="extract" class="section">
 
<div id="extract" class="section">
  
=== <code>Extract</code> ===
+
=== Extract ===
  
; ''class'' <code>Extract</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">lookup_name</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#Extract|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Extract</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">lookup_name</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Extracts a component of a date as a number.
+
提取日期的一个组成部分作为一个数字。
  
Takes an <code>expression</code> representing a <code>DateField</code>, <code>DateTimeField</code>,
+
取一个表示 <code>DateField</code><code>DateTimeField</code><code>TimeField</code> <code>DurationField</code> 和一个 <code>lookup_name</code> <code>expression</code>,并返回<code>lookup_name</code> 作为 <code>IntegerField</code> 引用的日期的一部分。 Django 通常使用数据库的提取功能,因此您可以使用数据库支持的任何 <code>lookup_name</code>。 通常由 <code>pytz</code> 提供的 <code>tzinfo</code> 子类可以传递以提取特定时区中的值。
<code>TimeField</code>, or <code>DurationField</code> and a <code>lookup_name</code>, and returns the part
 
of the date referenced by <code>lookup_name</code> as an <code>IntegerField</code>.
 
Django usually uses the databases' extract function, so you may use any
 
<code>lookup_name</code> that your database supports. A <code>tzinfo</code> subclass, usually
 
provided by <code>pytz</code>, can be passed to extract a value in a specific timezone.
 
  
Given the datetime <code>2015-06-15 23:30:01.000321+00:00</code>, the built-in
+
给定日期时间 <code>2015-06-15 23:30:01.000321+00:00</code>,内置的 <code>lookup_name</code>s 返回:
<code>lookup_name</code>s return:
 
  
* &quot;year&quot;: 2015
+
* “年”:2015
* &quot;iso_year&quot;: 2015
+
* “iso_year”:2015
* &quot;quarter&quot;: 2
+
* “季度”:2
* &quot;month&quot;: 6
+
* “月”:6
* &quot;day&quot;: 15
+
* “天”:15
* &quot;week&quot;: 25
+
* “周”:25
* &quot;week_day&quot;: 2
+
* “week_day”:2
* &quot;hour&quot;: 23
+
* “小时”:23
* &quot;minute&quot;: 30
+
* “分钟”:30
* &quot;second&quot;: 1
+
* “第二个”:1
  
If a different timezone like <code>Australia/Melbourne</code> is active in Django, then
+
如果像 <code>Australia/Melbourne</code> 这样的不同时区在 Django 中处于活动状态,则在提取值之前将日期时间转换为时区。 上面示例日期中墨尔本的时区偏移为 +10:00。 此时区处于活动状态时返回的值将与上述相同,除了:
the datetime is converted to the timezone before the value is extracted. The
 
timezone offset for Melbourne in the example date above is +10:00. The values
 
returned when this timezone is active will be the same as above except for:
 
  
* &quot;day&quot;: 16
+
* “天”:16
* &quot;week_day&quot;: 3
+
* “week_day”:3
* &quot;hour&quot;: 9
+
* “小时”:9
  
 
<div class="admonition-week-day-values admonition">
 
<div class="admonition-week-day-values admonition">
  
<code>week_day</code> values
+
<code>week_day</code>
  
The <code>week_day</code> <code>lookup_type</code> is calculated differently from most
+
<code>week_day</code> <code>lookup_type</code> 的计算方式与大多数数据库和 Python 的标准函数不同。 此函数将返回 <code>1</code> 星期日,<code>2</code> 星期一,通过 <code>7</code> 星期六。
databases and from Python's standard functions. This function will return
 
<code>1</code> for Sunday, <code>2</code> for Monday, through <code>7</code> for Saturday.
 
  
The equivalent calculation in Python is:
+
Python 中的等效计算是:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第315行: 第284行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; dt = datetime(2015, 6, 15)
+
>>> dt = datetime(2015, 6, 15)
&gt;&gt;&gt; (dt.isoweekday() % 7) + 1
+
>>> (dt.isoweekday() % 7) + 1
2</pre>
+
2</syntaxhighlight>
  
 
</div>
 
</div>
第327行: 第296行:
 
<div class="admonition-week-values admonition">
 
<div class="admonition-week-values admonition">
  
<code>week</code> values
+
<code>week</code>
  
The <code>week</code> <code>lookup_type</code> is calculated based on [https://en.wikipedia.org/wiki/ISO-8601 ISO-8601], i.e.,
+
<code>week</code> <code>lookup_type</code> 根据[https://en.wikipedia.org/wiki/ISO-8601 ISO-8601]计算,即一周从星期一开始。 一年的第一周是包含该年第一个星期四的那一周,即 第一周是一年中的大部分(四天或更多)天。 返回的值在 1 52 53 的范围内。
a week starts on a Monday. The first week of a year is the one that
 
contains the year's first Thursday, i.e. the first week has the majority
 
(four or more) of its days in the year. The value returned is in the range
 
1 to 52 or 53.
 
  
  
 
</div>
 
</div>
Each <code>lookup_name</code> above has a corresponding <code>Extract</code> subclass (listed
+
上面的每个 <code>lookup_name</code> 都有一个相应的 <code>Extract</code> 子类(如下所列),通常应该使用它来代替更冗长的等效项,例如 使用 <code>ExtractYear(...)</code> 而不是 <code>Extract(..., lookup_name='year')</code>
below) that should typically be used instead of the more verbose equivalent,
 
e.g. use <code>ExtractYear(...)</code> rather than <code>Extract(..., lookup_name='year')</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第347行: 第310行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.db.models.functions import Extract
+
>>> from django.db.models.functions import Extract
&gt;&gt;&gt; start = datetime(2015, 6, 15)
+
>>> start = datetime(2015, 6, 15)
&gt;&gt;&gt; end = datetime(2015, 7, 2)
+
>>> end = datetime(2015, 7, 2)
&gt;&gt;&gt; Experiment.objects.create(
+
>>> Experiment.objects.create(
 
...    start_datetime=start, start_date=start.date(),
 
...    start_datetime=start, start_date=start.date(),
 
...    end_datetime=end, end_date=end.date())
 
...    end_datetime=end, end_date=end.date())
&gt;&gt;&gt; # Add the experiment start year as a field in the QuerySet.
+
>>> # Add the experiment start year as a field in the QuerySet.
&gt;&gt;&gt; experiment = Experiment.objects.annotate(
+
>>> experiment = Experiment.objects.annotate(
 
...    start_year=Extract('start_datetime', 'year')).get()
 
...    start_year=Extract('start_datetime', 'year')).get()
&gt;&gt;&gt; experiment.start_year
+
>>> experiment.start_year
 
2015
 
2015
&gt;&gt;&gt; # How many experiments completed in the same year in which they started?
+
>>> # How many experiments completed in the same year in which they started?
&gt;&gt;&gt; Experiment.objects.filter(
+
>>> Experiment.objects.filter(
 
...    start_datetime__year=Extract('end_datetime', 'year')).count()
 
...    start_datetime__year=Extract('end_datetime', 'year')).count()
1</pre>
+
1</syntaxhighlight>
  
 
</div>
 
</div>
第369行: 第332行:
 
<div id="datefield-extracts" class="section">
 
<div id="datefield-extracts" class="section">
  
==== <code>DateField</code> extracts ====
+
==== DateField 摘录 ====
  
; ''class'' <code>ExtractYear</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractYear|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractYear</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'year'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'year'</span></span>
 
;:  
 
;:  
  
 
<dl>
 
<dl>
<dt>''class'' <code>ExtractIsoYear</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractIsoYear|<span class="viewcode-link">[源代码]</span>]]</dt>
+
<dt>''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractIsoYear</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span></dt>
 
<dd><div class="versionadded">
 
<dd><div class="versionadded">
  
 
+
<p><span class="versionmodified added">2.2 版中的新功能。</span></p>
  
 
</div>
 
</div>
<p>Returns the ISO-8601 week-numbering year.</p>
+
<p>返回 ISO-8601 的周号年份。</p>
 
<dl>
 
<dl>
<dt><code>lookup_name = 'iso_year'</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'iso_year'</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
 
</dd></dl>
 
</dd></dl>
  
; ''class'' <code>ExtractMonth</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractMonth|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractMonth</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'month'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'month'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractDay</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractDay|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractDay</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'day'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'day'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractWeekDay</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractWeekDay|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractWeekDay</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'week_day'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'week_day'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractWeek</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractWeek|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractWeek</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'week'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'week'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractQuarter</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractQuarter|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractQuarter</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'quarter'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'quarter'</span></span>
 
;:  
 
;:  
  
These are logically equivalent to <code>Extract('date_field', lookup_name)</code>. Each
+
这些在逻辑上等同于 <code>Extract('date_field', lookup_name)</code>。 每个类也是在 <code>DateField</code> <code>DateTimeField</code> 上注册为 <code>__(lookup_name)</code> <code>Transform</code>,例如 <code>__year</code>
class is also a <code>Transform</code> registered on <code>DateField</code> and <code>DateTimeField</code>
 
as <code>__(lookup_name)</code>, e.g. <code>__year</code>.
 
  
Since <code>DateField</code>s don't have a time component, only <code>Extract</code> subclasses
+
由于 <code>DateField</code> 没有时间分量,因此只有处理日期部分的 <code>Extract</code> 子类可以与 <code>DateField</code> 一起使用:
that deal with date-parts can be used with <code>DateField</code>:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第419行: 第379行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; from django.db.models.functions import (
+
>>> from django.db.models.functions import (
 
...    ExtractDay, ExtractMonth, ExtractQuarter, ExtractWeek,
 
...    ExtractDay, ExtractMonth, ExtractQuarter, ExtractWeek,
 
...    ExtractWeekDay, ExtractIsoYear, ExtractYear,
 
...    ExtractWeekDay, ExtractIsoYear, ExtractYear,
 
... )
 
... )
&gt;&gt;&gt; start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
+
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
&gt;&gt;&gt; end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
+
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
&gt;&gt;&gt; Experiment.objects.create(
+
>>> Experiment.objects.create(
 
...    start_datetime=start_2015, start_date=start_2015.date(),
 
...    start_datetime=start_2015, start_date=start_2015.date(),
 
...    end_datetime=end_2015, end_date=end_2015.date())
 
...    end_datetime=end_2015, end_date=end_2015.date())
&gt;&gt;&gt; Experiment.objects.annotate(
+
>>> Experiment.objects.annotate(
 
...    year=ExtractYear('start_date'),
 
...    year=ExtractYear('start_date'),
 
...    isoyear=ExtractIsoYear('start_date'),
 
...    isoyear=ExtractIsoYear('start_date'),
第442行: 第402行:
 
... )
 
... )
 
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
  'day': 15, 'weekday': 2}</pre>
+
  'day': 15, 'weekday': 2}</syntaxhighlight>
  
 
</div>
 
</div>
第451行: 第411行:
 
<div id="datetimefield-extracts" class="section">
 
<div id="datetimefield-extracts" class="section">
  
==== <code>DateTimeField</code> extracts ====
+
==== DateTimeField 摘录 ====
  
In addition to the following, all extracts for <code>DateField</code> listed above may
+
除了以下内容之外,上面列出的 <code>DateField</code> 的所有提取物也可以用于 <code>DateTimeField</code>s
also be used on <code>DateTimeField</code>s .
 
  
; ''class'' <code>ExtractHour</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractHour|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractHour</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'hour'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'hour'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractMinute</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractMinute|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractMinute</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'minute'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'minute'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>ExtractSecond</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#ExtractSecond|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ExtractSecond</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>lookup_name = 'second'</code>
+
: ;; <span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'second'</span></span>
 
;:  
 
;:  
  
These are logically equivalent to <code>Extract('datetime_field', lookup_name)</code>.
+
这些在逻辑上等同于 <code>Extract('datetime_field', lookup_name)</code>。 每个类也是一个在 <code>DateTimeField</code> 上注册为 <code>__(lookup_name)</code> <code>Transform</code>,例如 <code>__minute</code>
Each class is also a <code>Transform</code> registered on <code>DateTimeField</code> as
 
<code>__(lookup_name)</code>, e.g. <code>__minute</code>.
 
  
<code>DateTimeField</code> examples:
+
<code>DateTimeField</code> 示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第478行: 第435行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; from django.db.models.functions import (
+
>>> from django.db.models.functions import (
 
...    ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
 
...    ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
 
...    ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay,
 
...    ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay,
 
...    ExtractYear,
 
...    ExtractYear,
 
... )
 
... )
&gt;&gt;&gt; start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
+
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
&gt;&gt;&gt; end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
+
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
&gt;&gt;&gt; Experiment.objects.create(
+
>>> Experiment.objects.create(
 
...    start_datetime=start_2015, start_date=start_2015.date(),
 
...    start_datetime=start_2015, start_date=start_2015.date(),
 
...    end_datetime=end_2015, end_date=end_2015.date())
 
...    end_datetime=end_2015, end_date=end_2015.date())
&gt;&gt;&gt; Experiment.objects.annotate(
+
>>> Experiment.objects.annotate(
 
...    year=ExtractYear('start_datetime'),
 
...    year=ExtractYear('start_datetime'),
 
...    isoyear=ExtractIsoYear('start_datetime'),
 
...    isoyear=ExtractIsoYear('start_datetime'),
第506行: 第463行:
 
... ).get(end_datetime__year=ExtractYear('start_datetime'))
 
... ).get(end_datetime__year=ExtractYear('start_datetime'))
 
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
  'day': 15, 'weekday': 2, 'hour': 23, 'minute': 30, 'second': 1}</pre>
+
  'day': 15, 'weekday': 2, 'hour': 23, 'minute': 30, 'second': 1}</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
When [[../../settings#std-setting-USE_TZ|<code>USE_TZ</code>]] is <code>True</code> then datetimes are stored in the database
+
[[#id2|:setting:`USE_TZ`]] <code>True</code> 时,日期时间以 UTC 格式存储在数据库中。 如果不同的时区在 Django 中处于活动状态,则在提取值之前将日期时间转换为该时区。 下面的示例转换为墨尔本时区 (UTC +10:00),这会更改返回的天、工作日和小时值:
in UTC. If a different timezone is active in Django, the datetime is converted
 
to that timezone before the value is extracted. The example below converts to
 
the Melbourne timezone (UTC +10:00), which changes the day, weekday, and hour
 
values that are returned:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第521行: 第474行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; import pytz
+
<syntaxhighlight lang="python">>>> import pytz
&gt;&gt;&gt; melb = pytz.timezone('Australia/Melbourne')  # UTC+10:00
+
>>> melb = pytz.timezone('Australia/Melbourne')  # UTC+10:00
&gt;&gt;&gt; with timezone.override(melb):
+
>>> with timezone.override(melb):
 
...    Experiment.objects.annotate(
 
...    Experiment.objects.annotate(
 
...        day=ExtractDay('start_datetime'),
 
...        day=ExtractDay('start_datetime'),
第531行: 第484行:
 
...        end_datetime__year=ExtractYear('start_datetime'),
 
...        end_datetime__year=ExtractYear('start_datetime'),
 
...    )
 
...    )
{'day': 16, 'weekday': 3, 'hour': 9}</pre>
+
{'day': 16, 'weekday': 3, 'hour': 9}</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
Explicitly passing the timezone to the <code>Extract</code> function behaves in the same
+
将时区显式传递给 <code>Extract</code> 函数的行为方式相同,并且优先于活动时区:
way, and takes priority over an active timezone:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第543行: 第495行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; import pytz
+
<syntaxhighlight lang="python">>>> import pytz
&gt;&gt;&gt; melb = pytz.timezone('Australia/Melbourne')
+
>>> melb = pytz.timezone('Australia/Melbourne')
&gt;&gt;&gt; Experiment.objects.annotate(
+
>>> Experiment.objects.annotate(
 
...    day=ExtractDay('start_datetime', tzinfo=melb),
 
...    day=ExtractDay('start_datetime', tzinfo=melb),
 
...    weekday=ExtractWeekDay('start_datetime', tzinfo=melb),
 
...    weekday=ExtractWeekDay('start_datetime', tzinfo=melb),
第552行: 第504行:
 
...    end_datetime__year=ExtractYear('start_datetime'),
 
...    end_datetime__year=ExtractYear('start_datetime'),
 
... )
 
... )
{'day': 16, 'weekday': 3, 'hour': 9}</pre>
+
{'day': 16, 'weekday': 3, 'hour': 9}</syntaxhighlight>
  
 
</div>
 
</div>
第563行: 第515行:
 
<div id="now" class="section">
 
<div id="now" class="section">
  
=== <code>Now</code> ===
+
=== Now ===
  
; ''class'' <code>Now</code>[[../../_modules/django/db/models/functions/datetime.html#Now|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Now</span></span>
 
:  
 
:  
  
Returns the database server's current date and time when the query is executed,
+
返回执行查询时数据库服务器的当前日期和时间,通常使用 SQL <code>CURRENT_TIMESTAMP</code>
typically using the SQL <code>CURRENT_TIMESTAMP</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第577行: 第528行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Now
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Now
&gt;&gt;&gt; Article.objects.filter(published__lte=Now())
+
>>> Article.objects.filter(published__lte=Now())
&lt;QuerySet [&lt;Article: How to Django&gt;]&gt;</pre>
+
<QuerySet [<Article: How to Django>]></syntaxhighlight>
  
 
</div>
 
</div>
第586行: 第537行:
 
<div class="admonition-postgresql-considerations admonition">
 
<div class="admonition-postgresql-considerations admonition">
  
PostgreSQL considerations
+
PostgreSQL 的注意事项
  
On PostgreSQL, the SQL <code>CURRENT_TIMESTAMP</code> returns the time that the
+
PostgreSQL 上,SQL <code>CURRENT_TIMESTAMP</code> 返回当前事务开始的时间。 因此为了跨数据库兼容性,<code>Now()</code> 使用 <code>STATEMENT_TIMESTAMP</code> 代替。 如果您需要交易时间戳,请使用 [[../../contrib/postgres/functions#django.contrib.postgres.functions|django.contrib.postgres.functions.TransactionNow]]
current transaction started. Therefore for cross-database compatibility,
 
<code>Now()</code> uses <code>STATEMENT_TIMESTAMP</code> instead. If you need the transaction
 
timestamp, use [[../../contrib/postgres/functions#django.contrib.postgres.functions|<code>django.contrib.postgres.functions.TransactionNow</code>]].
 
  
  
第599行: 第547行:
 
<div id="trunc" class="section">
 
<div id="trunc" class="section">
  
=== <code>Trunc</code> ===
+
=== Trunc ===
  
; ''class'' <code>Trunc</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">kind</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#Trunc|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Trunc</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">kind</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Truncates a date up to a significant component.
+
将一个日期截断到一个重要的部分。
  
When you only care if something happened in a particular year, hour, or day,
+
当您只关心某事是否发生在特定的年、小时或日,而不是确切的秒时,那么 <code>Trunc</code>(及其子类)可用于过滤或聚合您的数据。 例如,您可以使用 <code>Trunc</code> 来计算每天的销售数量。
but not the exact second, then <code>Trunc</code> (and its subclasses) can be useful to
 
filter or aggregate your data. For example, you can use <code>Trunc</code> to calculate
 
the number of sales per day.
 
  
<code>Trunc</code> takes a single <code>expression</code>, representing a <code>DateField</code>,
+
<code>Trunc</code> 取单个 <code>expression</code>,代表一个 <code>DateField</code><code>TimeField</code> <code>DateTimeField</code>,一个 <code>kind</code> 代表一个日期或时间部分,以及 <code>output_field</code> <code>DateTimeField()</code><code>TimeField()</code> <code>DateField()</code>。 它根据 <code>output_field</code> 返回日期时间、日期或时间,最多 <code>kind</code> 的字段设置为其最小值。 如果省略<code>output_field</code>,则默认为<code>expression</code><code>output_field</code>。 通常由 <code>pytz</code> 提供的 <code>tzinfo</code> 子类可以传递以截断特定时区中的值。
<code>TimeField</code>, or <code>DateTimeField</code>, a <code>kind</code> representing a date or time
 
part, and an <code>output_field</code> that's either <code>DateTimeField()</code>,
 
<code>TimeField()</code>, or <code>DateField()</code>. It returns a datetime, date, or time
 
depending on <code>output_field</code>, with fields up to <code>kind</code> set to their minimum
 
value. If <code>output_field</code> is omitted, it will default to the <code>output_field</code>
 
of <code>expression</code>. A <code>tzinfo</code> subclass, usually provided by <code>pytz</code>, can be
 
passed to truncate a value in a specific timezone.
 
  
Given the datetime <code>2015-06-15 14:30:50.000321+00:00</code>, the built-in <code>kind</code>s
+
给定日期时间 <code>2015-06-15 14:30:50.000321+00:00</code>,内置的 <code>kind</code>s 返回:
return:
 
  
* &quot;year&quot;: 2015-01-01 00:00:00+00:00
+
* “年”:2015-01-01 00:00:00+00:00
* &quot;quarter&quot;: 2015-04-01 00:00:00+00:00
+
* “季”:2015-04-01 00:00:00+00:00
* &quot;month&quot;: 2015-06-01 00:00:00+00:00
+
* “月”:2015-06-01 00:00:00+00:00
* &quot;week&quot;: 2015-06-15 00:00:00+00:00
+
* “周”:2015-06-15 00:00:00+00:00
* &quot;day&quot;: 2015-06-15 00:00:00+00:00
+
* “日”:2015-06-15 00:00:00+00:00
* &quot;hour&quot;: 2015-06-15 14:00:00+00:00
+
* “小时”:2015-06-15 14:00:00+00:00
* &quot;minute&quot;: 2015-06-15 14:30:00+00:00
+
* “分钟”:2015-06-15 14:30:00+00:00
* &quot;second&quot;: 2015-06-15 14:30:50+00:00
+
* “第二个”:2015-06-15 14:30:50+00:00
  
If a different timezone like <code>Australia/Melbourne</code> is active in Django, then
+
如果像 <code>Australia/Melbourne</code> 这样的不同时区在 Django 中处于活动状态,则日期时间会在值被截断之前转换为新时区。 上面示例日期中墨尔本的时区偏移为 +10:00。 此时区处于活动状态时返回的值将是:
the datetime is converted to the new timezone before the value is truncated.
 
The timezone offset for Melbourne in the example date above is +10:00. The
 
values returned when this timezone is active will be:
 
  
* &quot;year&quot;: 2015-01-01 00:00:00+11:00
+
* “年”:2015-01-01 00:00:00+11:00
* &quot;quarter&quot;: 2015-04-01 00:00:00+10:00
+
* “季”:2015-04-01 00:00:00+10:00
* &quot;month&quot;: 2015-06-01 00:00:00+10:00
+
* “月”:2015-06-01 00:00:00+10:00
* &quot;week&quot;: 2015-06-16 00:00:00+10:00
+
* “周”:2015-06-16 00:00:00+10:00
* &quot;day&quot;: 2015-06-16 00:00:00+10:00
+
* “日”:2015-06-16 00:00:00+10:00
* &quot;hour&quot;: 2015-06-16 00:00:00+10:00
+
* “小时”:2015-06-16 00:00:00+10:00
* &quot;minute&quot;: 2015-06-16 00:30:00+10:00
+
* “分钟”:2015-06-16 00:30:00+10:00
* &quot;second&quot;: 2015-06-16 00:30:50+10:00
+
* “第二个”:2015-06-16 00:30:50+10:00
  
The year has an offset of +11:00 because the result transitioned into daylight
+
年的偏移量为 +11:00,因为结果过渡到夏令时。
saving time.
 
  
Each <code>kind</code> above has a corresponding <code>Trunc</code> subclass (listed below) that
+
上面的每个 <code>kind</code> 都有一个相应的 <code>Trunc</code> 子类(如下所列),通常应该使用它来代替更冗长的等效项,例如 使用 <code>TruncYear(...)</code> 而不是 <code>Trunc(..., kind='year')</code>
should typically be used instead of the more verbose equivalent,
 
e.g. use <code>TruncYear(...)</code> rather than <code>Trunc(..., kind='year')</code>.
 
  
The subclasses are all defined as transforms, but they aren't registered with
+
子类都定义为转换,但它们没有注册到任何字段,因为明显的查找名称已经被 <code>Extract</code> 子类保留。
any fields, because the obvious lookup names are already reserved by the
 
<code>Extract</code> subclasses.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第663行: 第592行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.db.models import Count, DateTimeField
+
>>> from django.db.models import Count, DateTimeField
&gt;&gt;&gt; from django.db.models.functions import Trunc
+
>>> from django.db.models.functions import Trunc
&gt;&gt;&gt; Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 30, 50, 321))
+
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 30, 50, 321))
&gt;&gt;&gt; Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 40, 2, 123))
+
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 40, 2, 123))
&gt;&gt;&gt; Experiment.objects.create(start_datetime=datetime(2015, 12, 25, 10, 5, 27, 999))
+
>>> Experiment.objects.create(start_datetime=datetime(2015, 12, 25, 10, 5, 27, 999))
&gt;&gt;&gt; experiments_per_day = Experiment.objects.annotate(
+
>>> experiments_per_day = Experiment.objects.annotate(
 
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
 
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
 
... ).values('start_day').annotate(experiments=Count('id'))
 
... ).values('start_day').annotate(experiments=Count('id'))
&gt;&gt;&gt; for exp in experiments_per_day:
+
>>> for exp in experiments_per_day:
 
...    print(exp['start_day'], exp['experiments'])
 
...    print(exp['start_day'], exp['experiments'])
 
...
 
...
 
2015-06-15 00:00:00 2
 
2015-06-15 00:00:00 2
 
2015-12-25 00:00:00 1
 
2015-12-25 00:00:00 1
&gt;&gt;&gt; experiments = Experiment.objects.annotate(
+
>>> experiments = Experiment.objects.annotate(
 
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
 
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
 
... ).filter(start_day=datetime(2015, 6, 15))
 
... ).filter(start_day=datetime(2015, 6, 15))
&gt;&gt;&gt; for exp in experiments:
+
>>> for exp in experiments:
 
...    print(exp.start_datetime)
 
...    print(exp.start_datetime)
 
...
 
...
 
2015-06-15 14:30:50.000321
 
2015-06-15 14:30:50.000321
2015-06-15 14:40:02.000123</pre>
+
2015-06-15 14:40:02.000123</syntaxhighlight>
  
 
</div>
 
</div>
第691行: 第620行:
 
<div id="datefield-truncation" class="section">
 
<div id="datefield-truncation" class="section">
  
==== <code>DateField</code> truncation ====
+
==== DateField 截断 ====
  
; ''class'' <code>TruncYear</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncYear|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncYear</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'year'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'year'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncMonth</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncMonth|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncMonth</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'month'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'month'</span></span>
 
;:  
 
;:  
  
 
<dl>
 
<dl>
<dt>''class'' <code>TruncWeek</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncWeek|<span class="viewcode-link">[源代码]</span>]]</dt>
+
<dt>''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncWeek</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span></dt>
 
<dd><div class="versionadded">
 
<dd><div class="versionadded">
  
 
+
<p><span class="versionmodified added">2.1 版中的新功能。</span></p>
  
 
</div>
 
</div>
<p>Truncates to midnight on the Monday of the week.</p>
+
<p>截断到每周一的午夜。</p>
 
<dl>
 
<dl>
<dt><code>kind = 'week'</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'week'</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
 
</dd></dl>
 
</dd></dl>
  
; ''class'' <code>TruncQuarter</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncQuarter|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncQuarter</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'quarter'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'quarter'</span></span>
 
;:  
 
;:  
  
These are logically equivalent to <code>Trunc('date_field', kind)</code>. They truncate
+
这些在逻辑上等同于 <code>Trunc('date_field', kind)</code>。 它们将日期的所有部分截断到 <code>kind</code>,这允许以较低的精度对日期进行分组或过滤。 <code>expression</code> <code>output_field</code> 可以是 <code>DateField</code> <code>DateTimeField</code>
all parts of the date up to <code>kind</code> which allows grouping or filtering dates
 
with less precision. <code>expression</code> can have an <code>output_field</code> of either
 
<code>DateField</code> or <code>DateTimeField</code>.
 
  
Since <code>DateField</code>s don't have a time component, only <code>Trunc</code> subclasses
+
由于 <code>DateField</code> 没有时间分量,因此只有处理日期部分的 <code>Trunc</code> 子类可以与 <code>DateField</code> 一起使用:
that deal with date-parts can be used with <code>DateField</code>:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第730行: 第655行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.db.models import Count
+
>>> from django.db.models import Count
&gt;&gt;&gt; from django.db.models.functions import TruncMonth, TruncYear
+
>>> from django.db.models.functions import TruncMonth, TruncYear
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
+
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
&gt;&gt;&gt; start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
+
>>> start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
&gt;&gt;&gt; start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
+
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start1, start_date=start1.date())
+
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start2, start_date=start2.date())
+
>>> Experiment.objects.create(start_datetime=start2, start_date=start2.date())
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start3, start_date=start3.date())
+
>>> Experiment.objects.create(start_datetime=start3, start_date=start3.date())
&gt;&gt;&gt; experiments_per_year = Experiment.objects.annotate(
+
>>> experiments_per_year = Experiment.objects.annotate(
 
...    year=TruncYear('start_date')).values('year').annotate(
 
...    year=TruncYear('start_date')).values('year').annotate(
 
...    experiments=Count('id'))
 
...    experiments=Count('id'))
&gt;&gt;&gt; for exp in experiments_per_year:
+
>>> for exp in experiments_per_year:
 
...    print(exp['year'], exp['experiments'])
 
...    print(exp['year'], exp['experiments'])
 
...
 
...
第749行: 第674行:
 
2015-01-01 2
 
2015-01-01 2
  
&gt;&gt;&gt; import pytz
+
>>> import pytz
&gt;&gt;&gt; melb = pytz.timezone('Australia/Melbourne')
+
>>> melb = pytz.timezone('Australia/Melbourne')
&gt;&gt;&gt; experiments_per_month = Experiment.objects.annotate(
+
>>> experiments_per_month = Experiment.objects.annotate(
 
...    month=TruncMonth('start_datetime', tzinfo=melb)).values('month').annotate(
 
...    month=TruncMonth('start_datetime', tzinfo=melb)).values('month').annotate(
 
...    experiments=Count('id'))
 
...    experiments=Count('id'))
&gt;&gt;&gt; for exp in experiments_per_month:
+
>>> for exp in experiments_per_month:
 
...    print(exp['month'], exp['experiments'])
 
...    print(exp['month'], exp['experiments'])
 
...
 
...
 
2015-06-01 00:00:00+10:00 1
 
2015-06-01 00:00:00+10:00 1
 
2016-01-01 00:00:00+11:00 1
 
2016-01-01 00:00:00+11:00 1
2014-06-01 00:00:00+10:00 1</pre>
+
2014-06-01 00:00:00+10:00 1</syntaxhighlight>
  
 
</div>
 
</div>
第768行: 第693行:
 
<div id="datetimefield-truncation" class="section">
 
<div id="datetimefield-truncation" class="section">
  
==== <code>DateTimeField</code> truncation ====
+
==== DateTimeField 截断 ====
  
 
<dl>
 
<dl>
<dt>''class'' <code>TruncDate</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncDate|<span class="viewcode-link">[源代码]</span>]]</dt>
+
<dt>''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncDate</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span></dt>
 
<dd><dl>
 
<dd><dl>
<dt><code>lookup_name = 'date'</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'date'</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
  
 
<dl>
 
<dl>
<dt><code>output_field = DateField()</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">output_field</span> <span class="pre">=</span> <span class="pre">DateField()</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
 
</dd></dl>
 
</dd></dl>
  
<code>TruncDate</code> casts <code>expression</code> to a date rather than using the built-in SQL
+
<code>TruncDate</code> <code>expression</code> 转换为日期,而不是使用内置的 SQL 截断函数。 它也在 <code>DateTimeField</code> 上注册为 <code>__date</code> 的转换。
truncate function. It's also registered as a transform on <code>DateTimeField</code> as
 
<code>__date</code>.
 
  
 
<dl>
 
<dl>
<dt>''class'' <code>TruncTime</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncTime|<span class="viewcode-link">[源代码]</span>]]</dt>
+
<dt>''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncTime</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span></dt>
 
<dd><dl>
 
<dd><dl>
<dt><code>lookup_name = 'time'</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">lookup_name</span> <span class="pre">=</span> <span class="pre">'time'</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
  
 
<dl>
 
<dl>
<dt><code>output_field = TimeField()</code></dt>
+
<dt><span class="sig-name descname"><span class="pre">output_field</span> <span class="pre">=</span> <span class="pre">TimeField()</span></span></dt>
 
<dd></dd></dl>
 
<dd></dd></dl>
 
</dd></dl>
 
</dd></dl>
  
<code>TruncTime</code> casts <code>expression</code> to a time rather than using the built-in SQL
+
<code>TruncTime</code> <code>expression</code> 转换为时间,而不是使用内置的 SQL 截断函数。 它也在 <code>DateTimeField</code> 上注册为 <code>__time</code> 的转换。
truncate function. It's also registered as a transform on <code>DateTimeField</code> as
 
<code>__time</code>.
 
  
; ''class'' <code>TruncDay</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncDay|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncDay</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'day'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'day'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncHour</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncHour|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncHour</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'hour'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'hour'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncMinute</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncMinute|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncMinute</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'minute'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'minute'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncSecond</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncSecond|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncSecond</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'second'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'second'</span></span>
 
;:  
 
;:  
  
These are logically equivalent to <code>Trunc('datetime_field', kind)</code>. They
+
这些在逻辑上等同于 <code>Trunc('datetime_field', kind)</code>。 它们将日期的所有部分截断到 <code>kind</code> 并允许以较低的精度对日期时间进行分组或过滤。 <code>expression</code> 必须有 <code>DateTimeField</code> <code>output_field</code>
truncate all parts of the date up to <code>kind</code> and allow grouping or filtering
 
datetimes with less precision. <code>expression</code> must have an <code>output_field</code> of
 
<code>DateTimeField</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第827行: 第745行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import date, datetime
+
<syntaxhighlight lang="python">>>> from datetime import date, datetime
&gt;&gt;&gt; from django.db.models import Count
+
>>> from django.db.models import Count
&gt;&gt;&gt; from django.db.models.functions import (
+
>>> from django.db.models.functions import (
 
...    TruncDate, TruncDay, TruncHour, TruncMinute, TruncSecond,
 
...    TruncDate, TruncDay, TruncHour, TruncMinute, TruncSecond,
 
... )
 
... )
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; import pytz
+
>>> import pytz
&gt;&gt;&gt; start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
+
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start1, start_date=start1.date())
+
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
&gt;&gt;&gt; melb = pytz.timezone('Australia/Melbourne')
+
>>> melb = pytz.timezone('Australia/Melbourne')
&gt;&gt;&gt; Experiment.objects.annotate(
+
>>> Experiment.objects.annotate(
 
...    date=TruncDate('start_datetime'),
 
...    date=TruncDate('start_datetime'),
 
...    day=TruncDay('start_datetime', tzinfo=melb),
 
...    day=TruncDay('start_datetime', tzinfo=melb),
第845行: 第763行:
 
... ).values('date', 'day', 'hour', 'minute', 'second').get()
 
... ).values('date', 'day', 'hour', 'minute', 'second').get()
 
{'date': datetime.date(2014, 6, 15),
 
{'date': datetime.date(2014, 6, 15),
  'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=&lt;DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD&gt;),
+
  'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
  'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=&lt;DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD&gt;),
+
  'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
  'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=&lt;UTC&gt;),
+
  'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=<UTC>),
  'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=&lt;UTC&gt;)
+
  'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=<UTC>)
}</pre>
+
}</syntaxhighlight>
  
 
</div>
 
</div>
第858行: 第776行:
 
<div id="timefield-truncation" class="section">
 
<div id="timefield-truncation" class="section">
  
==== <code>TimeField</code> truncation ====
+
==== TimeField 截断 ====
  
; ''class'' <code>TruncHour</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncHour|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncHour</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'hour'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'hour'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncMinute</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncMinute|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncMinute</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'minute'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'minute'</span></span>
 
;:  
 
;:  
  
; ''class'' <code>TruncSecond</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">output_field</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="n">tzinfo</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/datetime.html#TruncSecond|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">TruncSecond</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">output_field</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="n"><span class="pre">tzinfo</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
: ;; <code>kind = 'second'</code>
+
: ;; <span class="sig-name descname"><span class="pre">kind</span> <span class="pre">=</span> <span class="pre">'second'</span></span>
 
;:  
 
;:  
  
These are logically equivalent to <code>Trunc('time_field', kind)</code>. They truncate
+
这些在逻辑上等同于 <code>Trunc('time_field', kind)</code>。 它们将时间的所有部分截断到 <code>kind</code>,这允许以较低的精度对时间进行分组或过滤。 <code>expression</code> <code>output_field</code> 可以是 <code>TimeField</code> <code>DateTimeField</code>
all parts of the time up to <code>kind</code> which allows grouping or filtering times
 
with less precision. <code>expression</code> can have an <code>output_field</code> of either
 
<code>TimeField</code> or <code>DateTimeField</code>.
 
  
Since <code>TimeField</code>s don't have a date component, only <code>Trunc</code> subclasses
+
由于 <code>TimeField</code> 没有日期组件,因此只有处理时间部分的 <code>Trunc</code> 子类可以与 <code>TimeField</code> 一起使用:
that deal with time-parts can be used with <code>TimeField</code>:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第884行: 第798行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from datetime import datetime
+
<syntaxhighlight lang="python">>>> from datetime import datetime
&gt;&gt;&gt; from django.db.models import Count, TimeField
+
>>> from django.db.models import Count, TimeField
&gt;&gt;&gt; from django.db.models.functions import TruncHour
+
>>> from django.db.models.functions import TruncHour
&gt;&gt;&gt; from django.utils import timezone
+
>>> from django.utils import timezone
&gt;&gt;&gt; start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
+
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
&gt;&gt;&gt; start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
+
>>> start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
&gt;&gt;&gt; start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
+
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start1, start_time=start1.time())
+
>>> Experiment.objects.create(start_datetime=start1, start_time=start1.time())
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start2, start_time=start2.time())
+
>>> Experiment.objects.create(start_datetime=start2, start_time=start2.time())
&gt;&gt;&gt; Experiment.objects.create(start_datetime=start3, start_time=start3.time())
+
>>> Experiment.objects.create(start_datetime=start3, start_time=start3.time())
&gt;&gt;&gt; experiments_per_hour = Experiment.objects.annotate(
+
>>> experiments_per_hour = Experiment.objects.annotate(
 
...    hour=TruncHour('start_datetime', output_field=TimeField()),
 
...    hour=TruncHour('start_datetime', output_field=TimeField()),
 
... ).values('hour').annotate(experiments=Count('id'))
 
... ).values('hour').annotate(experiments=Count('id'))
&gt;&gt;&gt; for exp in experiments_per_hour:
+
>>> for exp in experiments_per_hour:
 
...    print(exp['hour'], exp['experiments'])
 
...    print(exp['hour'], exp['experiments'])
 
...
 
...
第903行: 第817行:
 
17:00:00 1
 
17:00:00 1
  
&gt;&gt;&gt; import pytz
+
>>> import pytz
&gt;&gt;&gt; melb = pytz.timezone('Australia/Melbourne')
+
>>> melb = pytz.timezone('Australia/Melbourne')
&gt;&gt;&gt; experiments_per_hour = Experiment.objects.annotate(
+
>>> experiments_per_hour = Experiment.objects.annotate(
 
...    hour=TruncHour('start_datetime', tzinfo=melb),
 
...    hour=TruncHour('start_datetime', tzinfo=melb),
 
... ).values('hour').annotate(experiments=Count('id'))
 
... ).values('hour').annotate(experiments=Count('id'))
&gt;&gt;&gt; for exp in experiments_per_hour:
+
>>> for exp in experiments_per_hour:
 
...    print(exp['hour'], exp['experiments'])
 
...    print(exp['hour'], exp['experiments'])
 
...
 
...
 
2014-06-16 00:00:00+10:00 2
 
2014-06-16 00:00:00+10:00 2
2016-01-01 04:00:00+11:00 1</pre>
+
2016-01-01 04:00:00+11:00 1</syntaxhighlight>
  
 
</div>
 
</div>
第925行: 第839行:
 
<div id="math-functions" class="section">
 
<div id="math-functions" class="section">
  
<span id="id2"></span>
+
<span id="id4"></span>
== Math Functions ==
+
== 数学函数 ==
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.2 版中的新功能。</span>
  
  
 
</div>
 
</div>
We'll be using the following model in math function examples:
+
我们将在数学函数示例中使用以下模型:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第939行: 第854行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>class Vector(models.Model):
+
<syntaxhighlight lang="python">class Vector(models.Model):
 
     x = models.FloatField()
 
     x = models.FloatField()
     y = models.FloatField()</pre>
+
     y = models.FloatField()</syntaxhighlight>
  
 
</div>
 
</div>
第948行: 第863行:
 
<div id="abs" class="section">
 
<div id="abs" class="section">
  
=== <code>Abs</code> ===
+
=== Abs ===
  
; ''class'' <code>Abs</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Abs|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Abs</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the absolute value of a numeric field or expression.
+
返回一个数值字段或表达式的绝对值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第961行: 第876行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Abs
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Abs
&gt;&gt;&gt; Vector.objects.create(x=-0.5, y=1.1)
+
>>> Vector.objects.create(x=-0.5, y=1.1)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_abs=Abs('x'), y_abs=Abs('y')).get()
+
>>> vector = Vector.objects.annotate(x_abs=Abs('x'), y_abs=Abs('y')).get()
&gt;&gt;&gt; vector.x_abs, vector.y_abs
+
>>> vector.x_abs, vector.y_abs
(0.5, 1.1)</pre>
+
(0.5, 1.1)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第976行: 第891行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Abs
+
>>> from django.db.models.functions import Abs
&gt;&gt;&gt; FloatField.register_lookup(Abs)
+
>>> FloatField.register_lookup(Abs)
&gt;&gt;&gt; # Get vectors inside the unit cube
+
>>> # Get vectors inside the unit cube
&gt;&gt;&gt; vectors = Vector.objects.filter(x__abs__lt=1, y__abs__lt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__abs__lt=1, y__abs__lt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第989行: 第904行:
 
<div id="acos" class="section">
 
<div id="acos" class="section">
  
=== <code>ACos</code> ===
+
=== ACos ===
  
; ''class'' <code>ACos</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#ACos|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ACos</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the arccosine of a numeric field or expression. The expression value
+
返回数字字段或表达式的反余弦值。 表达式值必须在 -1 1 的范围内。
must be within the range -1 to 1.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,003行: 第917行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import ACos
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import ACos
&gt;&gt;&gt; Vector.objects.create(x=0.5, y=-0.9)
+
>>> Vector.objects.create(x=0.5, y=-0.9)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_acos=ACos('x'), y_acos=ACos('y')).get()
+
>>> vector = Vector.objects.annotate(x_acos=ACos('x'), y_acos=ACos('y')).get()
&gt;&gt;&gt; vector.x_acos, vector.y_acos
+
>>> vector.x_acos, vector.y_acos
(1.0471975511965979, 2.6905658417935308)</pre>
+
(1.0471975511965979, 2.6905658417935308)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,018行: 第932行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import ACos
+
>>> from django.db.models.functions import ACos
&gt;&gt;&gt; FloatField.register_lookup(ACos)
+
>>> FloatField.register_lookup(ACos)
&gt;&gt;&gt; # Get vectors whose arccosine is less than 1
+
>>> # Get vectors whose arccosine is less than 1
&gt;&gt;&gt; vectors = Vector.objects.filter(x__acos__lt=1, y__acos__lt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__acos__lt=1, y__acos__lt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第1,031行: 第945行:
 
<div id="asin" class="section">
 
<div id="asin" class="section">
  
=== <code>ASin</code> ===
+
=== ASin ===
  
; ''class'' <code>ASin</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#ASin|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ASin</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the arcsine of a numeric field or expression. The expression value must
+
返回数值字段或表达式的反正弦。 表达式值必须在 -1 1 的范围内。
be in the range -1 to 1.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,045行: 第958行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import ASin
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import ASin
&gt;&gt;&gt; Vector.objects.create(x=0, y=1)
+
>>> Vector.objects.create(x=0, y=1)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_asin=ASin('x'), y_asin=ASin('y')).get()
+
>>> vector = Vector.objects.annotate(x_asin=ASin('x'), y_asin=ASin('y')).get()
&gt;&gt;&gt; vector.x_asin, vector.y_asin
+
>>> vector.x_asin, vector.y_asin
(0.0, 1.5707963267948966)</pre>
+
(0.0, 1.5707963267948966)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,060行: 第973行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import ASin
+
>>> from django.db.models.functions import ASin
&gt;&gt;&gt; FloatField.register_lookup(ASin)
+
>>> FloatField.register_lookup(ASin)
&gt;&gt;&gt; # Get vectors whose arcsine is less than 1
+
>>> # Get vectors whose arcsine is less than 1
&gt;&gt;&gt; vectors = Vector.objects.filter(x__asin__lt=1, y__asin__lt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__asin__lt=1, y__asin__lt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第1,073行: 第986行:
 
<div id="atan" class="section">
 
<div id="atan" class="section">
  
=== <code>ATan</code> ===
+
=== ATan ===
  
; ''class'' <code>ATan</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#ATan|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ATan</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the arctangent of a numeric field or expression.
+
返回一个数值字段或表达式的正切值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,086行: 第999行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import ATan
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import ATan
&gt;&gt;&gt; Vector.objects.create(x=3.12, y=6.987)
+
>>> Vector.objects.create(x=3.12, y=6.987)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_atan=ATan('x'), y_atan=ATan('y')).get()
+
>>> vector = Vector.objects.annotate(x_atan=ATan('x'), y_atan=ATan('y')).get()
&gt;&gt;&gt; vector.x_atan, vector.y_atan
+
>>> vector.x_atan, vector.y_atan
(1.2606282660069106, 1.428638798133829)</pre>
+
(1.2606282660069106, 1.428638798133829)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,101行: 第1,014行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import ATan
+
>>> from django.db.models.functions import ATan
&gt;&gt;&gt; FloatField.register_lookup(ATan)
+
>>> FloatField.register_lookup(ATan)
&gt;&gt;&gt; # Get vectors whose arctangent is less than 2
+
>>> # Get vectors whose arctangent is less than 2
&gt;&gt;&gt; vectors = Vector.objects.filter(x__atan__lt=2, y__atan__lt=2)</pre>
+
>>> vectors = Vector.objects.filter(x__atan__lt=2, y__atan__lt=2)</syntaxhighlight>
  
 
</div>
 
</div>
第1,114行: 第1,027行:
 
<div id="atan2" class="section">
 
<div id="atan2" class="section">
  
=== <code>ATan2</code> ===
+
=== ATan2 ===
  
; ''class'' <code>ATan2</code><span class="sig-paren">(</span>''<span class="n">expression1</span>'', ''<span class="n">expression2</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#ATan2|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">ATan2</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression1</span></span>'', ''<span class="n"><span class="pre">expression2</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the arctangent of <code>expression1 / expression2</code>.
+
返回 <code>expression1 / expression2</code> 的反正切值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,127行: 第1,040行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import ATan2
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import ATan2
&gt;&gt;&gt; Vector.objects.create(x=2.5, y=1.9)
+
>>> Vector.objects.create(x=2.5, y=1.9)
&gt;&gt;&gt; vector = Vector.objects.annotate(atan2=ATan2('x', 'y')).get()
+
>>> vector = Vector.objects.annotate(atan2=ATan2('x', 'y')).get()
&gt;&gt;&gt; vector.atan2
+
>>> vector.atan2
0.9209258773829491</pre>
+
0.9209258773829491</syntaxhighlight>
  
 
</div>
 
</div>
第1,140行: 第1,053行:
 
<div id="ceil" class="section">
 
<div id="ceil" class="section">
  
=== <code>Ceil</code> ===
+
=== Ceil ===
  
; ''class'' <code>Ceil</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Ceil|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Ceil</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the smallest integer greater than or equal to a numeric field or
+
返回大于或等于一个数值字段或表达式的最小整数。
expression.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,154行: 第1,066行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Ceil
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Ceil
&gt;&gt;&gt; Vector.objects.create(x=3.12, y=7.0)
+
>>> Vector.objects.create(x=3.12, y=7.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_ceil=Ceil('x'), y_ceil=Ceil('y')).get()
+
>>> vector = Vector.objects.annotate(x_ceil=Ceil('x'), y_ceil=Ceil('y')).get()
&gt;&gt;&gt; vector.x_ceil, vector.y_ceil
+
>>> vector.x_ceil, vector.y_ceil
(4.0, 7.0)</pre>
+
(4.0, 7.0)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,169行: 第1,081行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Ceil
+
>>> from django.db.models.functions import Ceil
&gt;&gt;&gt; FloatField.register_lookup(Ceil)
+
>>> FloatField.register_lookup(Ceil)
&gt;&gt;&gt; # Get vectors whose ceil is less than 10
+
>>> # Get vectors whose ceil is less than 10
&gt;&gt;&gt; vectors = Vector.objects.filter(x__ceil__lt=10, y__ceil__lt=10)</pre>
+
>>> vectors = Vector.objects.filter(x__ceil__lt=10, y__ceil__lt=10)</syntaxhighlight>
  
 
</div>
 
</div>
第1,182行: 第1,094行:
 
<div id="cos" class="section">
 
<div id="cos" class="section">
  
=== <code>Cos</code> ===
+
=== Cos ===
  
; ''class'' <code>Cos</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Cos|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Cos</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the cosine of a numeric field or expression.
+
返回一个数值字段或表达式的余弦值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,195行: 第1,107行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Cos
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Cos
&gt;&gt;&gt; Vector.objects.create(x=-8.0, y=3.1415926)
+
>>> Vector.objects.create(x=-8.0, y=3.1415926)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_cos=Cos('x'), y_cos=Cos('y')).get()
+
>>> vector = Vector.objects.annotate(x_cos=Cos('x'), y_cos=Cos('y')).get()
&gt;&gt;&gt; vector.x_cos, vector.y_cos
+
>>> vector.x_cos, vector.y_cos
(-0.14550003380861354, -0.9999999999999986)</pre>
+
(-0.14550003380861354, -0.9999999999999986)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,210行: 第1,122行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Cos
+
>>> from django.db.models.functions import Cos
&gt;&gt;&gt; FloatField.register_lookup(Cos)
+
>>> FloatField.register_lookup(Cos)
&gt;&gt;&gt; # Get vectors whose cosine is less than 0.5
+
>>> # Get vectors whose cosine is less than 0.5
&gt;&gt;&gt; vectors = Vector.objects.filter(x__cos__lt=0.5, y__cos__lt=0.5)</pre>
+
>>> vectors = Vector.objects.filter(x__cos__lt=0.5, y__cos__lt=0.5)</syntaxhighlight>
  
 
</div>
 
</div>
第1,223行: 第1,135行:
 
<div id="cot" class="section">
 
<div id="cot" class="section">
  
=== <code>Cot</code> ===
+
=== Cot ===
  
; ''class'' <code>Cot</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Cot|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Cot</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the cotangent of a numeric field or expression.
+
返回数值字段或表达式的正切值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,236行: 第1,148行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Cot
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Cot
&gt;&gt;&gt; Vector.objects.create(x=12.0, y=1.0)
+
>>> Vector.objects.create(x=12.0, y=1.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_cot=Cot('x'), y_cot=Cot('y')).get()
+
>>> vector = Vector.objects.annotate(x_cot=Cot('x'), y_cot=Cot('y')).get()
&gt;&gt;&gt; vector.x_cot, vector.y_cot
+
>>> vector.x_cot, vector.y_cot
(-1.5726734063976826, 0.642092615934331)</pre>
+
(-1.5726734063976826, 0.642092615934331)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,251行: 第1,163行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Cot
+
>>> from django.db.models.functions import Cot
&gt;&gt;&gt; FloatField.register_lookup(Cot)
+
>>> FloatField.register_lookup(Cot)
&gt;&gt;&gt; # Get vectors whose cotangent is less than 1
+
>>> # Get vectors whose cotangent is less than 1
&gt;&gt;&gt; vectors = Vector.objects.filter(x__cot__lt=1, y__cot__lt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__cot__lt=1, y__cot__lt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第1,264行: 第1,176行:
 
<div id="degrees" class="section">
 
<div id="degrees" class="section">
  
=== <code>Degrees</code> ===
+
=== Degrees ===
  
; ''class'' <code>Degrees</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Degrees|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Degrees</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Converts a numeric field or expression from radians to degrees.
+
将数值字段或表达式从弧度转换为度。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,277行: 第1,189行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Degrees
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Degrees
&gt;&gt;&gt; Vector.objects.create(x=-1.57, y=3.14)
+
>>> Vector.objects.create(x=-1.57, y=3.14)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_d=Degrees('x'), y_d=Degrees('y')).get()
+
>>> vector = Vector.objects.annotate(x_d=Degrees('x'), y_d=Degrees('y')).get()
&gt;&gt;&gt; vector.x_d, vector.y_d
+
>>> vector.x_d, vector.y_d
(-89.95437383553924, 179.9087476710785)</pre>
+
(-89.95437383553924, 179.9087476710785)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,292行: 第1,204行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Degrees
+
>>> from django.db.models.functions import Degrees
&gt;&gt;&gt; FloatField.register_lookup(Degrees)
+
>>> FloatField.register_lookup(Degrees)
&gt;&gt;&gt; # Get vectors whose degrees are less than 360
+
>>> # Get vectors whose degrees are less than 360
&gt;&gt;&gt; vectors = Vector.objects.filter(x__degrees__lt=360, y__degrees__lt=360)</pre>
+
>>> vectors = Vector.objects.filter(x__degrees__lt=360, y__degrees__lt=360)</syntaxhighlight>
  
 
</div>
 
</div>
第1,305行: 第1,217行:
 
<div id="exp" class="section">
 
<div id="exp" class="section">
  
=== <code>Exp</code> ===
+
=== Exp ===
  
; ''class'' <code>Exp</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Exp|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Exp</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the value of <code>e</code> (the natural logarithm base) raised to the power of
+
返回 <code>e</code>(自然对数底)的数值字段或表达式的幂。
a numeric field or expression.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,319行: 第1,230行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Exp
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Exp
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=-2.0)
+
>>> Vector.objects.create(x=5.4, y=-2.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_exp=Exp('x'), y_exp=Exp('y')).get()
+
>>> vector = Vector.objects.annotate(x_exp=Exp('x'), y_exp=Exp('y')).get()
&gt;&gt;&gt; vector.x_exp, vector.y_exp
+
>>> vector.x_exp, vector.y_exp
(221.40641620418717, 0.1353352832366127)</pre>
+
(221.40641620418717, 0.1353352832366127)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,334行: 第1,245行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Exp
+
>>> from django.db.models.functions import Exp
&gt;&gt;&gt; FloatField.register_lookup(Exp)
+
>>> FloatField.register_lookup(Exp)
&gt;&gt;&gt; # Get vectors whose exp() is greater than 10
+
>>> # Get vectors whose exp() is greater than 10
&gt;&gt;&gt; vectors = Vector.objects.filter(x__exp__gt=10, y__exp__gt=10)</pre>
+
>>> vectors = Vector.objects.filter(x__exp__gt=10, y__exp__gt=10)</syntaxhighlight>
  
 
</div>
 
</div>
第1,347行: 第1,258行:
 
<div id="floor" class="section">
 
<div id="floor" class="section">
  
=== <code>Floor</code> ===
+
=== Floor ===
  
; ''class'' <code>Floor</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Floor|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Floor</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the largest integer value not greater than a numeric field or
+
返回不大于数值字段或表达式的最大整数值。
expression.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,361行: 第1,271行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Floor
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Floor
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=-2.3)
+
>>> Vector.objects.create(x=5.4, y=-2.3)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_floor=Floor('x'), y_floor=Floor('y')).get()
+
>>> vector = Vector.objects.annotate(x_floor=Floor('x'), y_floor=Floor('y')).get()
&gt;&gt;&gt; vector.x_floor, vector.y_floor
+
>>> vector.x_floor, vector.y_floor
(5.0, -3.0)</pre>
+
(5.0, -3.0)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,376行: 第1,286行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Floor
+
>>> from django.db.models.functions import Floor
&gt;&gt;&gt; FloatField.register_lookup(Floor)
+
>>> FloatField.register_lookup(Floor)
&gt;&gt;&gt; # Get vectors whose floor() is greater than 10
+
>>> # Get vectors whose floor() is greater than 10
&gt;&gt;&gt; vectors = Vector.objects.filter(x__floor__gt=10, y__floor__gt=10)</pre>
+
>>> vectors = Vector.objects.filter(x__floor__gt=10, y__floor__gt=10)</syntaxhighlight>
  
 
</div>
 
</div>
第1,389行: 第1,299行:
 
<div id="ln" class="section">
 
<div id="ln" class="section">
  
=== <code>Ln</code> ===
+
=== Ln ===
  
; ''class'' <code>Ln</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Ln|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Ln</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the natural logarithm a numeric field or expression.
+
返回一个数值字段或表达式的自然对数。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,402行: 第1,312行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Ln
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Ln
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=233.0)
+
>>> Vector.objects.create(x=5.4, y=233.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_ln=Ln('x'), y_ln=Ln('y')).get()
+
>>> vector = Vector.objects.annotate(x_ln=Ln('x'), y_ln=Ln('y')).get()
&gt;&gt;&gt; vector.x_ln, vector.y_ln
+
>>> vector.x_ln, vector.y_ln
(1.6863989535702288, 5.4510384535657)</pre>
+
(1.6863989535702288, 5.4510384535657)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,417行: 第1,327行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Ln
+
>>> from django.db.models.functions import Ln
&gt;&gt;&gt; FloatField.register_lookup(Ln)
+
>>> FloatField.register_lookup(Ln)
&gt;&gt;&gt; # Get vectors whose value greater than e
+
>>> # Get vectors whose value greater than e
&gt;&gt;&gt; vectors = Vector.objects.filter(x__ln__gt=1, y__ln__gt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__ln__gt=1, y__ln__gt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第1,430行: 第1,340行:
 
<div id="log" class="section">
 
<div id="log" class="section">
  
=== <code>Log</code> ===
+
=== Log ===
  
; ''class'' <code>Log</code><span class="sig-paren">(</span>''<span class="n">expression1</span>'', ''<span class="n">expression2</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Log|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Log</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression1</span></span>'', ''<span class="n"><span class="pre">expression2</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts two numeric fields or expressions and returns the logarithm of
+
接受两个数字字段或表达式,并返回第一个字段的对数到第二个字段的基数。
the first to base of the second.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,444行: 第1,353行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Log
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Log
&gt;&gt;&gt; Vector.objects.create(x=2.0, y=4.0)
+
>>> Vector.objects.create(x=2.0, y=4.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(log=Log('x', 'y')).get()
+
>>> vector = Vector.objects.annotate(log=Log('x', 'y')).get()
&gt;&gt;&gt; vector.log
+
>>> vector.log
2.0</pre>
+
2.0</syntaxhighlight>
  
 
</div>
 
</div>
第1,457行: 第1,366行:
 
<div id="mod" class="section">
 
<div id="mod" class="section">
  
=== <code>Mod</code> ===
+
=== Mod ===
  
; ''class'' <code>Mod</code><span class="sig-paren">(</span>''<span class="n">expression1</span>'', ''<span class="n">expression2</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Mod|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Mod</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression1</span></span>'', ''<span class="n"><span class="pre">expression2</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts two numeric fields or expressions and returns the remainder of
+
接受两个数值字段或表达式,并返回第一个字段除以第二个字段的余数(模数运算)。
the first divided by the second (modulo operation).
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,471行: 第1,379行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Mod
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Mod
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=2.3)
+
>>> Vector.objects.create(x=5.4, y=2.3)
&gt;&gt;&gt; vector = Vector.objects.annotate(mod=Mod('x', 'y')).get()
+
>>> vector = Vector.objects.annotate(mod=Mod('x', 'y')).get()
&gt;&gt;&gt; vector.mod
+
>>> vector.mod
0.8</pre>
+
0.8</syntaxhighlight>
  
 
</div>
 
</div>
第1,484行: 第1,392行:
 
<div id="pi" class="section">
 
<div id="pi" class="section">
  
=== <code>Pi</code> ===
+
=== Pi ===
  
; ''class'' <code>Pi</code><span class="sig-paren">(</span>''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Pi|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Pi</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the value of the mathematical constant <code>π</code>.
+
返回数学常数 <code>π</code> 的值。
  
  
第1,495行: 第1,403行:
 
<div id="power" class="section">
 
<div id="power" class="section">
  
=== <code>Power</code> ===
+
=== Power ===
  
; ''class'' <code>Power</code><span class="sig-paren">(</span>''<span class="n">expression1</span>'', ''<span class="n">expression2</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Power|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Power</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression1</span></span>'', ''<span class="n"><span class="pre">expression2</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts two numeric fields or expressions and returns the value of the first
+
接受两个数值字段或表达式,并将第一个字段的值提高到第二个字段的幂。
raised to the power of the second.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,509行: 第1,416行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Power
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Power
&gt;&gt;&gt; Vector.objects.create(x=2, y=-2)
+
>>> Vector.objects.create(x=2, y=-2)
&gt;&gt;&gt; vector = Vector.objects.annotate(power=Power('x', 'y')).get()
+
>>> vector = Vector.objects.annotate(power=Power('x', 'y')).get()
&gt;&gt;&gt; vector.power
+
>>> vector.power
0.25</pre>
+
0.25</syntaxhighlight>
  
 
</div>
 
</div>
第1,522行: 第1,429行:
 
<div id="radians" class="section">
 
<div id="radians" class="section">
  
=== <code>Radians</code> ===
+
=== Radians ===
  
; ''class'' <code>Radians</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Radians|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Radians</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Converts a numeric field or expression from degrees to radians.
+
将数值字段或表达式从度数转换为弧度。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,535行: 第1,442行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Radians
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Radians
&gt;&gt;&gt; Vector.objects.create(x=-90, y=180)
+
>>> Vector.objects.create(x=-90, y=180)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_r=Radians('x'), y_r=Radians('y')).get()
+
>>> vector = Vector.objects.annotate(x_r=Radians('x'), y_r=Radians('y')).get()
&gt;&gt;&gt; vector.x_r, vector.y_r
+
>>> vector.x_r, vector.y_r
(-1.5707963267948966, 3.141592653589793)</pre>
+
(-1.5707963267948966, 3.141592653589793)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,550行: 第1,457行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Radians
+
>>> from django.db.models.functions import Radians
&gt;&gt;&gt; FloatField.register_lookup(Radians)
+
>>> FloatField.register_lookup(Radians)
&gt;&gt;&gt; # Get vectors whose radians are less than 1
+
>>> # Get vectors whose radians are less than 1
&gt;&gt;&gt; vectors = Vector.objects.filter(x__radians__lt=1, y__radians__lt=1)</pre>
+
>>> vectors = Vector.objects.filter(x__radians__lt=1, y__radians__lt=1)</syntaxhighlight>
  
 
</div>
 
</div>
第1,563行: 第1,470行:
 
<div id="round" class="section">
 
<div id="round" class="section">
  
=== <code>Round</code> ===
+
=== Round ===
  
; ''class'' <code>Round</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Round|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Round</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Rounds a numeric field or expression to the nearest integer. Whether half
+
将数字字段或表达式四舍五入为最接近的整数。 半值是向上还是向下四舍五入取决于数据库。
values are rounded up or down depends on the database.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,577行: 第1,483行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Round
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Round
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=-2.3)
+
>>> Vector.objects.create(x=5.4, y=-2.3)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_r=Round('x'), y_r=Round('y')).get()
+
>>> vector = Vector.objects.annotate(x_r=Round('x'), y_r=Round('y')).get()
&gt;&gt;&gt; vector.x_r, vector.y_r
+
>>> vector.x_r, vector.y_r
(5.0, -2.0)</pre>
+
(5.0, -2.0)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,592行: 第1,498行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Round
+
>>> from django.db.models.functions import Round
&gt;&gt;&gt; FloatField.register_lookup(Round)
+
>>> FloatField.register_lookup(Round)
&gt;&gt;&gt; # Get vectors whose round() is less than 20
+
>>> # Get vectors whose round() is less than 20
&gt;&gt;&gt; vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20)</pre>
+
>>> vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20)</syntaxhighlight>
  
 
</div>
 
</div>
第1,605行: 第1,511行:
 
<div id="sin" class="section">
 
<div id="sin" class="section">
  
=== <code>Sin</code> ===
+
=== Sin ===
  
; ''class'' <code>Sin</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Sin|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Sin</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the sine of a numeric field or expression.
+
返回一个数值字段或表达式的正弦值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,618行: 第1,524行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Sin
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Sin
&gt;&gt;&gt; Vector.objects.create(x=5.4, y=-2.3)
+
>>> Vector.objects.create(x=5.4, y=-2.3)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_sin=Sin('x'), y_sin=Sin('y')).get()
+
>>> vector = Vector.objects.annotate(x_sin=Sin('x'), y_sin=Sin('y')).get()
&gt;&gt;&gt; vector.x_sin, vector.y_sin
+
>>> vector.x_sin, vector.y_sin
(-0.7727644875559871, -0.7457052121767203)</pre>
+
(-0.7727644875559871, -0.7457052121767203)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,633行: 第1,539行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Sin
+
>>> from django.db.models.functions import Sin
&gt;&gt;&gt; FloatField.register_lookup(Sin)
+
>>> FloatField.register_lookup(Sin)
&gt;&gt;&gt; # Get vectors whose sin() is less than 0
+
>>> # Get vectors whose sin() is less than 0
&gt;&gt;&gt; vectors = Vector.objects.filter(x__sin__lt=0, y__sin__lt=0)</pre>
+
>>> vectors = Vector.objects.filter(x__sin__lt=0, y__sin__lt=0)</syntaxhighlight>
  
 
</div>
 
</div>
第1,646行: 第1,552行:
 
<div id="sqrt" class="section">
 
<div id="sqrt" class="section">
  
=== <code>Sqrt</code> ===
+
=== Sqrt ===
  
; ''class'' <code>Sqrt</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Sqrt|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Sqrt</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the square root of a nonnegative numeric field or expression.
+
返回一个非负数值字段或表达式的平方根。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,659行: 第1,565行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Sqrt
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Sqrt
&gt;&gt;&gt; Vector.objects.create(x=4.0, y=12.0)
+
>>> Vector.objects.create(x=4.0, y=12.0)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_sqrt=Sqrt('x'), y_sqrt=Sqrt('y')).get()
+
>>> vector = Vector.objects.annotate(x_sqrt=Sqrt('x'), y_sqrt=Sqrt('y')).get()
&gt;&gt;&gt; vector.x_sqrt, vector.y_sqrt
+
>>> vector.x_sqrt, vector.y_sqrt
(2.0, 3.46410)</pre>
+
(2.0, 3.46410)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,674行: 第1,580行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Sqrt
+
>>> from django.db.models.functions import Sqrt
&gt;&gt;&gt; FloatField.register_lookup(Sqrt)
+
>>> FloatField.register_lookup(Sqrt)
&gt;&gt;&gt; # Get vectors whose sqrt() is less than 5
+
>>> # Get vectors whose sqrt() is less than 5
&gt;&gt;&gt; vectors = Vector.objects.filter(x__sqrt__lt=5, y__sqrt__lt=5)</pre>
+
>>> vectors = Vector.objects.filter(x__sqrt__lt=5, y__sqrt__lt=5)</syntaxhighlight>
  
 
</div>
 
</div>
第1,687行: 第1,593行:
 
<div id="tan" class="section">
 
<div id="tan" class="section">
  
=== <code>Tan</code> ===
+
=== Tan ===
  
; ''class'' <code>Tan</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/math.html#Tan|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Tan</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the tangent of a numeric field or expression.
+
返回一个数值字段或表达式的正切值。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,700行: 第1,606行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Tan
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Tan
&gt;&gt;&gt; Vector.objects.create(x=0, y=12)
+
>>> Vector.objects.create(x=0, y=12)
&gt;&gt;&gt; vector = Vector.objects.annotate(x_tan=Tan('x'), y_tan=Tan('y')).get()
+
>>> vector = Vector.objects.annotate(x_tan=Tan('x'), y_tan=Tan('y')).get()
&gt;&gt;&gt; vector.x_tan, vector.y_tan
+
>>> vector.x_tan, vector.y_tan
(0.0, -0.6358599286615808)</pre>
+
(0.0, -0.6358599286615808)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,715行: 第1,621行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import FloatField
+
<syntaxhighlight lang="python">>>> from django.db.models import FloatField
&gt;&gt;&gt; from django.db.models.functions import Tan
+
>>> from django.db.models.functions import Tan
&gt;&gt;&gt; FloatField.register_lookup(Tan)
+
>>> FloatField.register_lookup(Tan)
&gt;&gt;&gt; # Get vectors whose tangent is less than 0
+
>>> # Get vectors whose tangent is less than 0
&gt;&gt;&gt; vectors = Vector.objects.filter(x__tan__lt=0, y__tan__lt=0)</pre>
+
>>> vectors = Vector.objects.filter(x__tan__lt=0, y__tan__lt=0)</syntaxhighlight>
  
 
</div>
 
</div>
第1,730行: 第1,636行:
 
<div id="text-functions" class="section">
 
<div id="text-functions" class="section">
  
<span id="id3"></span>
+
<span id="id5"></span>
== Text functions ==
+
== 文本函数 ==
  
 
<div id="chr" class="section">
 
<div id="chr" class="section">
  
=== <code>Chr</code> ===
+
=== Chr ===
  
; ''class'' <code>Chr</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Chr|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Chr</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Accepts a numeric field or expression and returns the text representation of
+
接受数字字段或表达式,并将表达式的文本表示形式作为单个字符返回。 它的工作原理与 Python <code>chr()</code> 函数相同。
the expression as a single character. It works the same as Python's <code>chr()</code>
 
function.
 
  
Like [[#django.db.models.functions.Length|<code>Length</code>]], it can be registered as a transform on <code>IntegerField</code>.
+
[[#django.db.models.functions.Length|Length]] 一样,它可以注册为 <code>IntegerField</code> 上的变换。 默认查找名称是 <code>chr</code>
The default lookup name is <code>chr</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,758行: 第1,662行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Chr
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Chr
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.filter(name__startswith=Chr(ord('M'))).get()
+
>>> author = Author.objects.filter(name__startswith=Chr(ord('M'))).get()
&gt;&gt;&gt; print(author.name)
+
>>> print(author.name)
Margaret Smith</pre>
+
Margaret Smith</syntaxhighlight>
  
 
</div>
 
</div>
第1,771行: 第1,675行:
 
<div id="concat" class="section">
 
<div id="concat" class="section">
  
=== <code>Concat</code> ===
+
=== Concat ===
  
; ''class'' <code>Concat</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Concat|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Concat</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a list of at least two text fields or expressions and returns the
+
接受至少两个文本字段或表达式的列表并返回连接的文本。 每个参数必须是文本或字符类型。 如果你想连接一个 <code>TextField()</code> 和一个 <code>CharField()</code>,那么一定要告诉 Django <code>output_field</code> 应该是一个 <code>TextField()</code>。 在连接 <code>Value</code> 时,也需要指定 <code>output_field</code>,如下例所示。
concatenated text. Each argument must be of a text or char type. If you want
 
to concatenate a <code>TextField()</code> with a <code>CharField()</code>, then be sure to tell
 
Django that the <code>output_field</code> should be a <code>TextField()</code>. Specifying an
 
<code>output_field</code> is also required when concatenating a <code>Value</code> as in the
 
example below.
 
  
This function will never have a null result. On backends where a null argument
+
此函数永远不会有空结果。 在 null 参数导致整个表达式为 null 的后端,Django 将确保每个 null 部分首先转换为空字符串。
results in the entire expression being null, Django will ensure that each null
 
part is converted to an empty string first.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,793行: 第1,690行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; # Get the display name as &quot;name (goes_by)&quot;
+
<syntaxhighlight lang="python">>>> # Get the display name as "name (goes_by)"
&gt;&gt;&gt; from django.db.models import CharField, Value as V
+
>>> from django.db.models import CharField, Value as V
&gt;&gt;&gt; from django.db.models.functions import Concat
+
>>> from django.db.models.functions import Concat
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith', goes_by='Maggie')
+
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
&gt;&gt;&gt; author = Author.objects.annotate(
+
>>> author = Author.objects.annotate(
 
...    screen_name=Concat(
 
...    screen_name=Concat(
 
...        'name', V(' ('), 'goes_by', V(')'),
 
...        'name', V(' ('), 'goes_by', V(')'),
第1,803行: 第1,700行:
 
...    )
 
...    )
 
... ).get()
 
... ).get()
&gt;&gt;&gt; print(author.screen_name)
+
>>> print(author.screen_name)
Margaret Smith (Maggie)</pre>
+
Margaret Smith (Maggie)</syntaxhighlight>
  
 
</div>
 
</div>
第1,813行: 第1,710行:
 
<div id="left" class="section">
 
<div id="left" class="section">
  
=== <code>Left</code> ===
+
=== Left ===
  
; ''class'' <code>Left</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">length</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Left|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Left</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">length</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Returns the first <code>length</code> characters of the given text field or expression.
+
返回给定文本字段或表达式的前 <code>length</code> 个字符。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,831行: 第1,729行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Left
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Left
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(first_initial=Left('name', 1)).get()
+
>>> author = Author.objects.annotate(first_initial=Left('name', 1)).get()
&gt;&gt;&gt; print(author.first_initial)
+
>>> print(author.first_initial)
M</pre>
+
M</syntaxhighlight>
  
 
</div>
 
</div>
第1,844行: 第1,742行:
 
<div id="length" class="section">
 
<div id="length" class="section">
  
=== <code>Length</code> ===
+
=== Length ===
  
; ''class'' <code>Length</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Length|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Length</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a single text field or expression and returns the number of characters
+
接受单个文本字段或表达式并返回该值具有的字符数。 如果表达式为空,则长度也将为空。
the value has. If the expression is null, then the length will also be null.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,858行: 第1,755行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; # Get the length of the name and goes_by fields
+
<syntaxhighlight lang="python">>>> # Get the length of the name and goes_by fields
&gt;&gt;&gt; from django.db.models.functions import Length
+
>>> from django.db.models.functions import Length
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(
+
>>> author = Author.objects.annotate(
 
...    name_length=Length('name'),
 
...    name_length=Length('name'),
 
...    goes_by_length=Length('goes_by')).get()
 
...    goes_by_length=Length('goes_by')).get()
&gt;&gt;&gt; print(author.name_length, author.goes_by_length)
+
>>> print(author.name_length, author.goes_by_length)
(14, None)</pre>
+
(14, None)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
It can also be registered as a transform. For example:
+
它也可以注册为转换。 例如:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,876行: 第1,773行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import CharField
+
<syntaxhighlight lang="python">>>> from django.db.models import CharField
&gt;&gt;&gt; from django.db.models.functions import Length
+
>>> from django.db.models.functions import Length
&gt;&gt;&gt; CharField.register_lookup(Length)
+
>>> CharField.register_lookup(Length)
&gt;&gt;&gt; # Get authors whose name is longer than 7 characters
+
>>> # Get authors whose name is longer than 7 characters
&gt;&gt;&gt; authors = Author.objects.filter(name__length__gt=7)</pre>
+
>>> authors = Author.objects.filter(name__length__gt=7)</syntaxhighlight>
  
 
</div>
 
</div>
第1,889行: 第1,786行:
 
<div id="lower" class="section">
 
<div id="lower" class="section">
  
=== <code>Lower</code> ===
+
=== Lower ===
  
; ''class'' <code>Lower</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Lower|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Lower</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a single text field or expression and returns the lowercase
+
接受单个文本字段或表达式,并返回小写表示。
representation.
 
  
It can also be registered as a transform as described in [[#django.db.models.functions.Length|<code>Length</code>]].
+
它也可以注册为一个转换,如 [[#django.db.models.functions.Length|Length]] 中所述。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,905行: 第1,801行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Lower
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Lower
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(name_lower=Lower('name')).get()
+
>>> author = Author.objects.annotate(name_lower=Lower('name')).get()
&gt;&gt;&gt; print(author.name_lower)
+
>>> print(author.name_lower)
margaret smith</pre>
+
margaret smith</syntaxhighlight>
  
 
</div>
 
</div>
第1,918行: 第1,814行:
 
<div id="lpad" class="section">
 
<div id="lpad" class="section">
  
=== <code>LPad</code> ===
+
=== LPad ===
  
; ''class'' <code>LPad</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">length</span>'', ''<span class="n">fill_text</span><span class="o">=</span><span class="default_value">Value(' ')</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#LPad|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">LPad</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">length</span></span>'', ''<span class="n"><span class="pre">fill_text</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">Value('</span> <span class="pre">')</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Returns the value of the given text field or expression padded on the left side
+
返回用 <code>fill_text</code> 填充左侧的给定文本字段或表达式的值,以便结果值为 <code>length</code> 个字符长。 默认 <code>fill_text</code> 是一个空格。
with <code>fill_text</code> so that the resulting value is <code>length</code> characters long.
 
The default <code>fill_text</code> is a space.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,938行: 第1,833行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import Value
+
<syntaxhighlight lang="python">>>> from django.db.models import Value
&gt;&gt;&gt; from django.db.models.functions import LPad
+
>>> from django.db.models.functions import LPad
&gt;&gt;&gt; Author.objects.create(name='John', alias='j')
+
>>> Author.objects.create(name='John', alias='j')
&gt;&gt;&gt; Author.objects.update(name=LPad('name', 8, Value('abc')))
+
>>> Author.objects.update(name=LPad('name', 8, Value('abc')))
 
1
 
1
&gt;&gt;&gt; print(Author.objects.get(alias='j').name)
+
>>> print(Author.objects.get(alias='j').name)
abcaJohn</pre>
+
abcaJohn</syntaxhighlight>
  
 
</div>
 
</div>
第1,953行: 第1,848行:
 
<div id="ltrim" class="section">
 
<div id="ltrim" class="section">
  
=== <code>LTrim</code> ===
+
=== LTrim ===
  
; ''class'' <code>LTrim</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#LTrim|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">LTrim</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Similar to [[#django.db.models.functions.Trim|<code>Trim</code>]], but removes only leading
+
类似于 [[#django.db.models.functions.Trim|Trim]],但只删除前导空格。
spaces.
 
  
  
第1,970行: 第1,865行:
 
<div id="ord" class="section">
 
<div id="ord" class="section">
  
=== <code>Ord</code> ===
+
=== Ord ===
  
; ''class'' <code>Ord</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Ord|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Ord</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Accepts a single text field or expression and returns the Unicode code point
+
接受单个文本字段或表达式,并返回该表达式第一个字符的 Unicode 代码点值。 它的工作方式类似于 Python <code>ord()</code> 函数,但如果表达式的长度超过一个字符,则不会引发异常。
value for the first character of that expression. It works similar to Python's
 
<code>ord()</code> function, but an exception isn't raised if the expression is more
 
than one character long.
 
  
It can also be registered as a transform as described in [[#django.db.models.functions.Length|<code>Length</code>]].
+
它也可以注册为一个转换,如 [[#django.db.models.functions.Length|Length]] 中所述。 默认查找名称是 <code>ord</code>
The default lookup name is <code>ord</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第1,994行: 第1,886行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Ord
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Ord
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(name_code_point=Ord('name')).get()
+
>>> author = Author.objects.annotate(name_code_point=Ord('name')).get()
&gt;&gt;&gt; print(author.name_code_point)
+
>>> print(author.name_code_point)
77</pre>
+
77</syntaxhighlight>
  
 
</div>
 
</div>
第2,007行: 第1,899行:
 
<div id="repeat" class="section">
 
<div id="repeat" class="section">
  
=== <code>Repeat</code> ===
+
=== Repeat ===
  
; ''class'' <code>Repeat</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">number</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Repeat|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Repeat</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">number</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Returns the value of the given text field or expression repeated <code>number</code>
+
返回重复 <code>number</code> 次的给定文本字段或表达式的值。
times.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,026行: 第1,918行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Repeat
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Repeat
&gt;&gt;&gt; Author.objects.create(name='John', alias='j')
+
>>> Author.objects.create(name='John', alias='j')
&gt;&gt;&gt; Author.objects.update(name=Repeat('name', 3))
+
>>> Author.objects.update(name=Repeat('name', 3))
 
1
 
1
&gt;&gt;&gt; print(Author.objects.get(alias='j').name)
+
>>> print(Author.objects.get(alias='j').name)
JohnJohnJohn</pre>
+
JohnJohnJohn</syntaxhighlight>
  
 
</div>
 
</div>
第2,040行: 第1,932行:
 
<div id="replace" class="section">
 
<div id="replace" class="section">
  
=== <code>Replace</code> ===
+
=== Replace ===
  
; ''class'' <code>Replace</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">text</span>'', ''<span class="n">replacement</span><span class="o">=</span><span class="default_value">Value('')</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Replace|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Replace</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">text</span></span>'', ''<span class="n"><span class="pre">replacement</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">Value('')</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Replaces all occurrences of <code>text</code> with <code>replacement</code> in <code>expression</code>.
+
<code>expression</code> 中所有出现的 <code>text</code> 替换为 <code>replacement</code>。 默认替换文本是空字符串。 函数的参数区分大小写。
The default replacement text is the empty string. The arguments to the function
 
are case-sensitive.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,060行: 第1,951行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import Value
+
<syntaxhighlight lang="python">>>> from django.db.models import Value
&gt;&gt;&gt; from django.db.models.functions import Replace
+
>>> from django.db.models.functions import Replace
&gt;&gt;&gt; Author.objects.create(name='Margaret Johnson')
+
>>> Author.objects.create(name='Margaret Johnson')
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
+
>>> Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
 
2
 
2
&gt;&gt;&gt; Author.objects.values('name')
+
>>> Author.objects.values('name')
&lt;QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]&gt;</pre>
+
<QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]></syntaxhighlight>
  
 
</div>
 
</div>
第2,076行: 第1,967行:
 
<div id="reverse" class="section">
 
<div id="reverse" class="section">
  
=== <code>Reverse</code> ===
+
=== Reverse ===
  
; ''class'' <code>Reverse</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Reverse|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Reverse</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.2 版中的新功能。</span>
  
  
 
</div>
 
</div>
Accepts a single text field or expression and returns the characters of that
+
接受单个文本字段或表达式,并将该表达式的字符按相反顺序返回。
expression in reverse order.
 
  
It can also be registered as a transform as described in [[#django.db.models.functions.Length|<code>Length</code>]]. The
+
它也可以注册为一个转换,如 [[#django.db.models.functions.Length|Length]] 中所述。 默认查找名称是 <code>reverse</code>
default lookup name is <code>reverse</code>.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,098行: 第1,988行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Reverse
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Reverse
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(backward=Reverse('name')).get()
+
>>> author = Author.objects.annotate(backward=Reverse('name')).get()
&gt;&gt;&gt; print(author.backward)
+
>>> print(author.backward)
htimS teragraM</pre>
+
htimS teragraM</syntaxhighlight>
  
 
</div>
 
</div>
第2,111行: 第2,001行:
 
<div id="right" class="section">
 
<div id="right" class="section">
  
=== <code>Right</code> ===
+
=== Right ===
  
; ''class'' <code>Right</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">length</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Right|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Right</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">length</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Returns the last <code>length</code> characters of the given text field or expression.
+
返回给定文本字段或表达式的最后 <code>length</code> 个字符。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,129行: 第2,020行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Right
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Right
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(last_letter=Right('name', 1)).get()
+
>>> author = Author.objects.annotate(last_letter=Right('name', 1)).get()
&gt;&gt;&gt; print(author.last_letter)
+
>>> print(author.last_letter)
h</pre>
+
h</syntaxhighlight>
  
 
</div>
 
</div>
第2,142行: 第2,033行:
 
<div id="rpad" class="section">
 
<div id="rpad" class="section">
  
=== <code>RPad</code> ===
+
=== RPad ===
  
; ''class'' <code>RPad</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">length</span>'', ''<span class="n">fill_text</span><span class="o">=</span><span class="default_value">Value(' ')</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#RPad|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">RPad</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">length</span></span>'', ''<span class="n"><span class="pre">fill_text</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">Value('</span> <span class="pre">')</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Similar to [[#django.db.models.functions.LPad|<code>LPad</code>]], but pads on the right
+
类似于 [[#django.db.models.functions.LPad|LPad]],但焊盘在右侧。
side.
 
  
  
第2,159行: 第2,050行:
 
<div id="rtrim" class="section">
 
<div id="rtrim" class="section">
  
=== <code>RTrim</code> ===
+
=== RTrim ===
  
; ''class'' <code>RTrim</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#RTrim|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">RTrim</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Similar to [[#django.db.models.functions.Trim|<code>Trim</code>]], but removes only trailing
+
类似于 [[#django.db.models.functions.Trim|Trim]],但只删除尾随空格。
spaces.
 
  
  
第2,176行: 第2,067行:
 
<div id="strindex" class="section">
 
<div id="strindex" class="section">
  
=== <code>StrIndex</code> ===
+
=== StrIndex ===
  
; ''class'' <code>StrIndex</code><span class="sig-paren">(</span>''<span class="n">string</span>'', ''<span class="n">substring</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#StrIndex|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">StrIndex</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">string</span></span>'', ''<span class="n"><span class="pre">substring</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns a positive integer corresponding to the 1-indexed position of the first
+
返回与 <code>string</code> 中第一次出现 <code>substring</code> 的 1 索引位置相对应的正整数,如果未找到 <code>substring</code>,则返回 0。
occurrence of <code>substring</code> inside <code>string</code>, or 0 if <code>substring</code> is not
 
found.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,191行: 第2,080行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models import Value as V
+
<syntaxhighlight lang="python">>>> from django.db.models import Value as V
&gt;&gt;&gt; from django.db.models.functions import StrIndex
+
>>> from django.db.models.functions import StrIndex
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; Author.objects.create(name='Smith, Margaret')
+
>>> Author.objects.create(name='Smith, Margaret')
&gt;&gt;&gt; Author.objects.create(name='Margaret Jackson')
+
>>> Author.objects.create(name='Margaret Jackson')
&gt;&gt;&gt; Author.objects.filter(name='Margaret Jackson').annotate(
+
>>> Author.objects.filter(name='Margaret Jackson').annotate(
 
...    smith_index=StrIndex('name', V('Smith'))
 
...    smith_index=StrIndex('name', V('Smith'))
 
... ).get().smith_index
 
... ).get().smith_index
 
0
 
0
&gt;&gt;&gt; authors = Author.objects.annotate(
+
>>> authors = Author.objects.annotate(
 
...    smith_index=StrIndex('name', V('Smith'))
 
...    smith_index=StrIndex('name', V('Smith'))
 
... ).filter(smith_index__gt=0)
 
... ).filter(smith_index__gt=0)
&lt;QuerySet [&lt;Author: Margaret Smith&gt;, &lt;Author: Smith, Margaret&gt;]&gt;</pre>
+
<QuerySet [<Author: Margaret Smith>, <Author: Smith, Margaret>]></syntaxhighlight>
  
 
</div>
 
</div>
第2,212行: 第2,101行:
 
警告
 
警告
  
In MySQL, a database table's [[../../databases#mysql-collation|<span class="std std-ref">collation</span>]] determines
+
MySQL 中,数据库表的 [[../../databases#mysql-collation|collation]] 确定字符串比较(例如该函数的 <code>expression</code> <code>substring</code>)是否区分大小写。 默认情况下,比较不区分大小写。
whether string comparisons (such as the <code>expression</code> and <code>substring</code> of
 
this function) are case-sensitive. Comparisons are case-insensitive by
 
default.
 
  
  
第2,223行: 第2,109行:
 
<div id="substr" class="section">
 
<div id="substr" class="section">
  
=== <code>Substr</code> ===
+
=== Substr ===
  
; ''class'' <code>Substr</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">pos</span>'', ''<span class="n">length</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Substr|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Substr</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">pos</span></span>'', ''<span class="n"><span class="pre">length</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns a substring of length <code>length</code> from the field or expression starting
+
从从位置 <code>pos</code> 开始的字段或表达式中返回长度为 <code>length</code> 的子字符串。 该位置为 1 索引,因此该位置必须大于 0。 如果 <code>length</code> <code>None</code>,则将返回字符串的其余部分。
at position <code>pos</code>. The position is 1-indexed, so the position must be greater
 
than 0. If <code>length</code> is <code>None</code>, then the rest of the string will be returned.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,238行: 第2,122行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; # Set the alias to the first 5 characters of the name as lowercase
+
<syntaxhighlight lang="python">>>> # Set the alias to the first 5 characters of the name as lowercase
&gt;&gt;&gt; from django.db.models.functions import Lower, Substr
+
>>> from django.db.models.functions import Lower, Substr
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; Author.objects.update(alias=Lower(Substr('name', 1, 5)))
+
>>> Author.objects.update(alias=Lower(Substr('name', 1, 5)))
 
1
 
1
&gt;&gt;&gt; print(Author.objects.get(name='Margaret Smith').alias)
+
>>> print(Author.objects.get(name='Margaret Smith').alias)
marga</pre>
+
marga</syntaxhighlight>
  
 
</div>
 
</div>
第2,253行: 第2,137行:
 
<div id="trim" class="section">
 
<div id="trim" class="section">
  
=== <code>Trim</code> ===
+
=== Trim ===
  
; ''class'' <code>Trim</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Trim|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Trim</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
 
<div class="versionadded">
 
<div class="versionadded">
  
 +
<span class="versionmodified added">2.1 版中的新功能。</span>
  
  
 
</div>
 
</div>
Returns the value of the given text field or expression with leading and
+
返回给定的文本字段或表达式的值,并去除前导和尾部的空格。
trailing spaces removed.
 
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,272行: 第2,156行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Trim
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Trim
&gt;&gt;&gt; Author.objects.create(name='  John  ', alias='j')
+
>>> Author.objects.create(name='  John  ', alias='j')
&gt;&gt;&gt; Author.objects.update(name=Trim('name'))
+
>>> Author.objects.update(name=Trim('name'))
 
1
 
1
&gt;&gt;&gt; print(Author.objects.get(alias='j').name)
+
>>> print(Author.objects.get(alias='j').name)
John</pre>
+
John</syntaxhighlight>
  
 
</div>
 
</div>
第2,286行: 第2,170行:
 
<div id="upper" class="section">
 
<div id="upper" class="section">
  
=== <code>Upper</code> ===
+
=== Upper ===
  
; ''class'' <code>Upper</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/text.html#Upper|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Upper</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Accepts a single text field or expression and returns the uppercase
+
接受单个文本字段或表达式,并返回大写表示。
representation.
 
  
It can also be registered as a transform as described in [[#django.db.models.functions.Length|<code>Length</code>]].
+
它也可以注册为一个转换,如 [[#django.db.models.functions.Length|Length]] 中所述。
  
使用实例:
+
用法示例:
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,302行: 第2,185行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>&gt;&gt;&gt; from django.db.models.functions import Upper
+
<syntaxhighlight lang="python">>>> from django.db.models.functions import Upper
&gt;&gt;&gt; Author.objects.create(name='Margaret Smith')
+
>>> Author.objects.create(name='Margaret Smith')
&gt;&gt;&gt; author = Author.objects.annotate(name_upper=Upper('name')).get()
+
>>> author = Author.objects.annotate(name_upper=Upper('name')).get()
&gt;&gt;&gt; print(author.name_upper)
+
>>> print(author.name_upper)
MARGARET SMITH</pre>
+
MARGARET SMITH</syntaxhighlight>
  
 
</div>
 
</div>
第2,317行: 第2,200行:
 
<div id="window-functions" class="section">
 
<div id="window-functions" class="section">
  
<span id="id4"></span>
+
<span id="id6"></span>
== Window functions ==
+
== 窗口函数 ==
  
There are a number of functions to use in a
+
[[../expressions#django.db.models.expressions|Window]] 表达式中有许多函数可用于计算元素的等级或某些行的 [[#django.db.models.functions.Ntile|Ntile]]
[[../expressions#django.db.models.expressions|<code>Window</code>]] expression for computing the rank
 
of elements or the [[#django.db.models.functions.Ntile|<code>Ntile</code>]] of some rows.
 
  
 
<div id="cumedist" class="section">
 
<div id="cumedist" class="section">
  
=== <code>CumeDist</code> ===
+
=== CumeDist ===
  
; ''class'' <code>CumeDist</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#CumeDist|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">CumeDist</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Calculates the cumulative distribution of a value within a window or partition.
+
计算窗口或分区内某个值的累积分布。 累积分布定义为当前行之前或与之对等的行数除以帧中的总行数。
The cumulative distribution is defined as the number of rows preceding or
 
peered with the current row divided by the total number of rows in the frame.
 
  
  
第2,339行: 第2,218行:
 
<div id="denserank" class="section">
 
<div id="denserank" class="section">
  
=== <code>DenseRank</code> ===
+
=== DenseRank ===
  
; ''class'' <code>DenseRank</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#DenseRank|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">DenseRank</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Equivalent to [[#django.db.models.functions.Rank|<code>Rank</code>]] but does not have gaps.
+
相当于 [[#django.db.models.functions.Rank|Rank]] 但没有间隙。
  
  
第2,350行: 第2,229行:
 
<div id="firstvalue" class="section">
 
<div id="firstvalue" class="section">
  
=== <code>FirstValue</code> ===
+
=== FirstValue ===
  
; ''class'' <code>FirstValue</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#FirstValue|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">FirstValue</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Returns the value evaluated at the row that's the first row of the window
+
返回在窗口框架第一行的行处计算的值,如果不存在这样的值,则返回 <code>None</code>
frame, or <code>None</code> if no such value exists.
 
  
  
第2,362行: 第2,240行:
 
<div id="lag" class="section">
 
<div id="lag" class="section">
  
=== <code>Lag</code> ===
+
=== Lag ===
  
; ''class'' <code>Lag</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">offset</span><span class="o">=</span><span class="default_value">1</span>'', ''<span class="n">default</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#Lag|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Lag</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">offset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span>'', ''<span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Calculates the value offset by <code>offset</code>, and if no row exists there, returns
+
计算偏移<code>offset</code>的值,如果不存在行,则返回<code>default</code>
<code>default</code>.
 
  
<code>default</code> must have the same type as the <code>expression</code>, however, this is
+
<code>default</code> 必须与 <code>expression</code> 具有相同的类型,但是,这仅由数据库验证,而不是在 Python 中验证。
only validated by the database and not in Python.
 
  
 
<div class="admonition-mariadb-and-default admonition">
 
<div class="admonition-mariadb-and-default admonition">
  
MariaDB and <code>default</code>
+
MariaDB <code>default</code>
  
MariaDB [https://jira.mariadb.org/browse/MDEV-12981 doesn't support]
+
MariaDB [https://jira.mariadb.org/browse/MDEV-12981 不支持] <code>default</code> 参数。
the <code>default</code> parameter.
 
  
  
第2,386行: 第2,261行:
 
<div id="lastvalue" class="section">
 
<div id="lastvalue" class="section">
  
=== <code>LastValue</code> ===
+
=== LastValue ===
  
; ''class'' <code>LastValue</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#LastValue|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">LastValue</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Comparable to [[#django.db.models.functions.FirstValue|<code>FirstValue</code>]], it calculates the last value in a given
+
[[#django.db.models.functions.FirstValue|FirstValue]] 相比,它计算给定框架子句中的最后一个值。
frame clause.
 
  
  
第2,398行: 第2,272行:
 
<div id="lead" class="section">
 
<div id="lead" class="section">
  
=== <code>Lead</code> ===
+
=== Lead ===
  
; ''class'' <code>Lead</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">offset</span><span class="o">=</span><span class="default_value">1</span>'', ''<span class="n">default</span><span class="o">=</span><span class="default_value">None</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#Lead|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Lead</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">offset</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span>'', ''<span class="n"><span class="pre">default</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Calculates the leading value in a given [[../expressions#window-frames|<span class="std std-ref">frame</span>]]. Both
+
计算给定 [[../expressions#window-frames|]] 中的主值。 <code>offset</code> <code>default</code> 都相对于当前行进行评估。
<code>offset</code> and <code>default</code> are evaluated with respect to the current row.
 
  
<code>default</code> must have the same type as the <code>expression</code>, however, this is
+
<code>default</code> 必须与 <code>expression</code> 具有相同的类型,但是,这仅由数据库验证,而不是在 Python 中验证。
only validated by the database and not in Python.
 
  
 
<div class="admonition-mariadb-and-default admonition">
 
<div class="admonition-mariadb-and-default admonition">
  
MariaDB and <code>default</code>
+
MariaDB <code>default</code>
  
MariaDB [https://jira.mariadb.org/browse/MDEV-12981 doesn't support]
+
MariaDB [https://jira.mariadb.org/browse/MDEV-12981 不支持] <code>default</code> 参数。
the <code>default</code> parameter.
 
  
  
第2,422行: 第2,293行:
 
<div id="nthvalue" class="section">
 
<div id="nthvalue" class="section">
  
=== <code>NthValue</code> ===
+
=== NthValue ===
  
; ''class'' <code>NthValue</code><span class="sig-paren">(</span>''<span class="n">expression</span>'', ''<span class="n">nth</span><span class="o">=</span><span class="default_value">1</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#NthValue|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">NthValue</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">expression</span></span>'', ''<span class="n"><span class="pre">nth</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Computes the row relative to the offset <code>nth</code> (must be a positive value)
+
计算相对于窗口内偏移量 <code>nth</code>(必须是正值)的行。 如果不存在行,则返回 <code>None</code>
within the window. Returns <code>None</code> if no row exists.
 
  
Some databases may handle a nonexistent nth-value differently. For example,
+
某些数据库可能会以不同的方式处理不存在的第 n 个值。 例如,对于基于字符的表达式,Oracle 返回空字符串而不是 <code>None</code>。 在这些情况下,Django 不做任何转换。
Oracle returns an empty string rather than <code>None</code> for character-based
 
expressions. Django doesn't do any conversions in these cases.
 
  
  
第2,438行: 第2,306行:
 
<div id="ntile" class="section">
 
<div id="ntile" class="section">
  
=== <code>Ntile</code> ===
+
=== Ntile ===
  
; ''class'' <code>Ntile</code><span class="sig-paren">(</span>''<span class="n">num_buckets</span><span class="o">=</span><span class="default_value">1</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#Ntile|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Ntile</span></span><span class="sig-paren">(</span>''<span class="n"><span class="pre">num_buckets</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">1</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Calculates a partition for each of the rows in the frame clause, distributing
+
frame 子句中的每一行计算一个分区,在 1 <code>num_buckets</code> 之间尽可能均匀地分布数字。 如果行没有均匀地分成多个桶,一个或多个桶将被更频繁地表示。
numbers as evenly as possible between 1 and <code>num_buckets</code>. If the rows don't
 
divide evenly into a number of buckets, one or more buckets will be represented
 
more frequently.
 
  
  
第2,452行: 第2,317行:
 
<div id="percentrank" class="section">
 
<div id="percentrank" class="section">
  
=== <code>PercentRank</code> ===
+
=== PercentRank ===
  
; ''class'' <code>PercentRank</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#PercentRank|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">PercentRank</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Computes the percentile rank of the rows in the frame clause. This
+
计算框架子句中行的百分位等级。 此计算等效于评估:
computation is equivalent to evaluating:
 
  
 
<div class="highlight-default notranslate">
 
<div class="highlight-default notranslate">
第2,464行: 第2,328行:
 
<div class="highlight">
 
<div class="highlight">
  
<pre>(rank - 1) / (total rows - 1)</pre>
+
<syntaxhighlight lang="python">(rank - 1) / (total rows - 1)</syntaxhighlight>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
The following table explains the calculation for the percentile rank of a row:
+
下表解释了行的百分位数的计算:
  
 
{|
 
{|
!width="13%"| Row #
+
!width="13%"| #
!width="13%"| Value
+
!width="13%"|
!width="11%"| Rank
+
!width="11%"| 排名
!width="32%"| Calculation
+
!width="32%"| 计算
!width="32%"| Percent Rank
+
!width="32%"| 百分比排名
 
|-
 
|-
 
| 1
 
| 1
第2,525行: 第2,389行:
 
<div id="rank" class="section">
 
<div id="rank" class="section">
  
=== <code>Rank</code> ===
+
=== Rank ===
  
; ''class'' <code>Rank</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#Rank|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">Rank</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Comparable to <code>RowNumber</code>, this function ranks rows in the window. The
+
<code>RowNumber</code> 相比,此功能对窗口中的行进行排序。 计算出的排名包含差距。 使用 [[#django.db.models.functions.DenseRank|DenseRank]] 计算无间隙的秩。
computed rank contains gaps. Use [[#django.db.models.functions.DenseRank|<code>DenseRank</code>]] to compute rank without
 
gaps.
 
  
  
第2,538行: 第2,400行:
 
<div id="rownumber" class="section">
 
<div id="rownumber" class="section">
  
=== <code>RowNumber</code> ===
+
=== RowNumber ===
  
; ''class'' <code>RowNumber</code><span class="sig-paren">(</span>''<span class="o">*</span><span class="n">expressions</span>'', ''<span class="o">**</span><span class="n">extra</span>''<span class="sig-paren">)</span>[[../../_modules/django/db/models/functions/window.html#RowNumber|<span class="viewcode-link">[源代码]</span>]]
+
; ''<span class="pre">class</span>'' <span class="sig-name descname"><span class="pre">RowNumber</span></span><span class="sig-paren">(</span>''<span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">expressions</span></span>'', ''<span class="o"><span class="pre">**</span></span><span class="n"><span class="pre">extra</span></span>''<span class="sig-paren">)</span>
 
:  
 
:  
  
Computes the row number according to the ordering of either the frame clause
+
如果 [[../expressions#window-frames|窗口框架]] 没有分区,则根据框架子句的顺序或整个查询的顺序计算行号。
or the ordering of the whole query if there is no partitioning of the
+
 
[[../expressions#window-frames|<span class="std std-ref">window frame</span>]].
 
  
 +
</div>
  
 
</div>
 
</div>
  
 
</div>
 
</div>
 +
<div class="clearer">
 +
 +
  
 
</div>
 
</div>
  
[[Category:Django 2.2.x 中文文档]]
+
[[Category:Django 2.2.x 文档]]

2021年10月31日 (日) 04:05的最新版本

数据库函数

下面记录的类为用户提供了一种使用底层数据库提供的函数作为 Django 中的注释、聚合或过滤器的方法。 函数也是表达式,因此它们可以与聚合函数等其他表达式结合使用。

我们将在每个函数的示例中使用以下模型:

class Author(models.Model):
    name = models.CharField(max_length=50)
    age = models.PositiveIntegerField(null=True, blank=True)
    alias = models.CharField(max_length=50, null=True, blank=True)
    goes_by = models.CharField(max_length=50, null=True, blank=True)

我们通常不建议为 CharField 允许 null=True,因为这允许该字段有两个“空值”,但这对于下面的 Coalesce 示例很重要。

比较和转换函数

Cast

class Cast(expression, output_field)

强制 expression 的结果类型为 output_field 中的结果类型。

用法示例:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cast
>>> Author.objects.create(age=25, name='Margaret Smith')
>>> author = Author.objects.annotate(
...    age_as_float=Cast('age', output_field=FloatField()),
... ).get()
>>> print(author.age_as_float)
25.0

Coalesce

class Coalesce(*expressions, **extra)

接受至少包含两个字段名称或表达式的列表,并返回第一个非空值(请注意,空字符串不被视为空值)。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。

用法示例:

>>> # Get a screen name from least to most public
>>> from django.db.models import Sum, Value as V
>>> from django.db.models.functions import Coalesce
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
>>> author = Author.objects.annotate(
...    screen_name=Coalesce('alias', 'goes_by', 'name')).get()
>>> print(author.screen_name)
Maggie

>>> # Prevent an aggregate Sum() from returning None
>>> aggregated = Author.objects.aggregate(
...    combined_age=Coalesce(Sum('age'), V(0)),
...    combined_age_default=Sum('age'))
>>> print(aggregated['combined_age'])
0
>>> print(aggregated['combined_age_default'])
None

警告

除非显式转换为正确的数据库类型,否则在 MySQL 上传递给 Coalesce 的 Python 值可能会转换为不正确的类型:

>>> from django.db.models import DateTimeField
>>> from django.db.models.functions import Cast, Coalesce
>>> from django.utils import timezone
>>> now = timezone.now()
>>> Coalesce('updated', Cast(now, DateTimeField()))

Greatest

class Greatest(*expressions, **extra)

接受至少包含两个字段名称或表达式的列表并返回最大值。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。

用法示例:

class Blog(models.Model):
    body = models.TextField()
    modified = models.DateTimeField(auto_now=True)

class Comment(models.Model):
    body = models.TextField()
    modified = models.DateTimeField(auto_now=True)
    blog = models.ForeignKey(Blog, on_delete=models.CASCADE)

>>> from django.db.models.functions import Greatest
>>> blog = Blog.objects.create(body='Greatest is the best.')
>>> comment = Comment.objects.create(body='No, Least is better.', blog=blog)
>>> comments = Comment.objects.annotate(last_updated=Greatest('modified', 'blog__modified'))
>>> annotated_comment = comments.get()

annotated_comment.last_updated 将是 blog.modifiedcomment.modified 中最新的。

警告

当一个或多个表达式可能是 null 时,Greatest 的行为因数据库而异:

  • PostgreSQL: Greatest 将返回最大的非空表达式,如果所有表达式都是 null,则返回 null
  • SQLite、Oracle 和 MySQL:如果任何表达式为 null,则 Greatest 将返回 null

如果您知道要作为默认值提供的合理最小值,则可以使用 Coalesce 模拟 PostgreSQL 行为。


Least

class Least(*expressions, **extra)

接受至少包含两个字段名称或表达式的列表并返回最小值。 每个参数必须是相似的类型,所以混合文本和数字会导致数据库错误。

警告

当一个或多个表达式可能是 null 时,Least 的行为因数据库而异:

  • PostgreSQL: Least 将返回最小的非空表达式,如果所有表达式都是 null,则返回 null
  • SQLite、Oracle 和 MySQL:如果任何表达式为 null,则 Least 将返回 null

如果您知道要提供的合理最大值作为默认值,则可以使用 Coalesce 模拟 PostgreSQL 行为。


NullIf

class NullIf(expression1, expression2)

2.2 版中的新功能。


接受两个表达式,如果相等则返回 None,否则返回 expression1

关于 Oracle 的注意事项

由于 Oracle 约定 ,当表达式的类型为 CharField 时,此函数返回空字符串而不是 None

Oracle 禁止将 Value(None) 传递给 expression1,因为 Oracle 不接受 NULL 作为第一个参数。


日期函数

我们将在每个函数的示例中使用以下模型:

class Experiment(models.Model):
    start_datetime = models.DateTimeField()
    start_date = models.DateField(null=True, blank=True)
    start_time = models.TimeField(null=True, blank=True)
    end_datetime = models.DateTimeField(null=True, blank=True)
    end_date = models.DateField(null=True, blank=True)
    end_time = models.TimeField(null=True, blank=True)

Extract

class Extract(expression, lookup_name=None, tzinfo=None, **extra)

提取日期的一个组成部分作为一个数字。

取一个表示 DateFieldDateTimeFieldTimeFieldDurationField 和一个 lookup_nameexpression,并返回lookup_name 作为 IntegerField 引用的日期的一部分。 Django 通常使用数据库的提取功能,因此您可以使用数据库支持的任何 lookup_name。 通常由 pytz 提供的 tzinfo 子类可以传递以提取特定时区中的值。

给定日期时间 2015-06-15 23:30:01.000321+00:00,内置的 lookup_names 返回:

  • “年”:2015
  • “iso_year”:2015
  • “季度”:2
  • “月”:6
  • “天”:15
  • “周”:25
  • “week_day”:2
  • “小时”:23
  • “分钟”:30
  • “第二个”:1

如果像 Australia/Melbourne 这样的不同时区在 Django 中处于活动状态,则在提取值之前将日期时间转换为时区。 上面示例日期中墨尔本的时区偏移为 +10:00。 此时区处于活动状态时返回的值将与上述相同,除了:

  • “天”:16
  • “week_day”:3
  • “小时”:9

week_day

week_day lookup_type 的计算方式与大多数数据库和 Python 的标准函数不同。 此函数将返回 1 星期日,2 星期一,通过 7 星期六。

Python 中的等效计算是:

>>> from datetime import datetime
>>> dt = datetime(2015, 6, 15)
>>> (dt.isoweekday() % 7) + 1
2

week

week lookup_type 根据ISO-8601计算,即一周从星期一开始。 一年的第一周是包含该年第一个星期四的那一周,即 第一周是一年中的大部分(四天或更多)天。 返回的值在 1 到 52 或 53 的范围内。


上面的每个 lookup_name 都有一个相应的 Extract 子类(如下所列),通常应该使用它来代替更冗长的等效项,例如 使用 ExtractYear(...) 而不是 Extract(..., lookup_name='year')

用法示例:

>>> from datetime import datetime
>>> from django.db.models.functions import Extract
>>> start = datetime(2015, 6, 15)
>>> end = datetime(2015, 7, 2)
>>> Experiment.objects.create(
...    start_datetime=start, start_date=start.date(),
...    end_datetime=end, end_date=end.date())
>>> # Add the experiment start year as a field in the QuerySet.
>>> experiment = Experiment.objects.annotate(
...    start_year=Extract('start_datetime', 'year')).get()
>>> experiment.start_year
2015
>>> # How many experiments completed in the same year in which they started?
>>> Experiment.objects.filter(
...    start_datetime__year=Extract('end_datetime', 'year')).count()
1

DateField 摘录

class ExtractYear(expression, tzinfo=None, **extra)
;; lookup_name = 'year'
class ExtractIsoYear(expression, tzinfo=None, **extra)

2.2 版中的新功能。

返回 ISO-8601 的周号年份。

lookup_name = 'iso_year'
class ExtractMonth(expression, tzinfo=None, **extra)
;; lookup_name = 'month'
class ExtractDay(expression, tzinfo=None, **extra)
;; lookup_name = 'day'
class ExtractWeekDay(expression, tzinfo=None, **extra)
;; lookup_name = 'week_day'
class ExtractWeek(expression, tzinfo=None, **extra)
;; lookup_name = 'week'
class ExtractQuarter(expression, tzinfo=None, **extra)
;; lookup_name = 'quarter'

这些在逻辑上等同于 Extract('date_field', lookup_name)。 每个类也是在 DateFieldDateTimeField 上注册为 __(lookup_name)Transform,例如 __year

由于 DateField 没有时间分量,因此只有处理日期部分的 Extract 子类可以与 DateField 一起使用:

>>> from datetime import datetime
>>> from django.utils import timezone
>>> from django.db.models.functions import (
...     ExtractDay, ExtractMonth, ExtractQuarter, ExtractWeek,
...     ExtractWeekDay, ExtractIsoYear, ExtractYear,
... )
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
>>> Experiment.objects.create(
...    start_datetime=start_2015, start_date=start_2015.date(),
...    end_datetime=end_2015, end_date=end_2015.date())
>>> Experiment.objects.annotate(
...     year=ExtractYear('start_date'),
...     isoyear=ExtractIsoYear('start_date'),
...     quarter=ExtractQuarter('start_date'),
...     month=ExtractMonth('start_date'),
...     week=ExtractWeek('start_date'),
...     day=ExtractDay('start_date'),
...     weekday=ExtractWeekDay('start_date'),
... ).values('year', 'isoyear', 'quarter', 'month', 'week', 'day', 'weekday').get(
...     end_date__year=ExtractYear('start_date'),
... )
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 'day': 15, 'weekday': 2}

DateTimeField 摘录

除了以下内容之外,上面列出的 DateField 的所有提取物也可以用于 DateTimeFields 。

class ExtractHour(expression, tzinfo=None, **extra)
;; lookup_name = 'hour'
class ExtractMinute(expression, tzinfo=None, **extra)
;; lookup_name = 'minute'
class ExtractSecond(expression, tzinfo=None, **extra)
;; lookup_name = 'second'

这些在逻辑上等同于 Extract('datetime_field', lookup_name)。 每个类也是一个在 DateTimeField 上注册为 __(lookup_name)Transform,例如 __minute

DateTimeField 示例:

>>> from datetime import datetime
>>> from django.utils import timezone
>>> from django.db.models.functions import (
...     ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,
...     ExtractQuarter, ExtractSecond, ExtractWeek, ExtractWeekDay,
...     ExtractYear,
... )
>>> start_2015 = datetime(2015, 6, 15, 23, 30, 1, tzinfo=timezone.utc)
>>> end_2015 = datetime(2015, 6, 16, 13, 11, 27, tzinfo=timezone.utc)
>>> Experiment.objects.create(
...    start_datetime=start_2015, start_date=start_2015.date(),
...    end_datetime=end_2015, end_date=end_2015.date())
>>> Experiment.objects.annotate(
...     year=ExtractYear('start_datetime'),
...     isoyear=ExtractIsoYear('start_datetime'),
...     quarter=ExtractQuarter('start_datetime'),
...     month=ExtractMonth('start_datetime'),
...     week=ExtractWeek('start_datetime'),
...     day=ExtractDay('start_datetime'),
...     weekday=ExtractWeekDay('start_datetime'),
...     hour=ExtractHour('start_datetime'),
...     minute=ExtractMinute('start_datetime'),
...     second=ExtractSecond('start_datetime'),
... ).values(
...     'year', 'isoyear', 'month', 'week', 'day',
...     'weekday', 'hour', 'minute', 'second',
... ).get(end_datetime__year=ExtractYear('start_datetime'))
{'year': 2015, 'isoyear': 2015, 'quarter': 2, 'month': 6, 'week': 25,
 'day': 15, 'weekday': 2, 'hour': 23, 'minute': 30, 'second': 1}

:setting:`USE_TZ`True 时,日期时间以 UTC 格式存储在数据库中。 如果不同的时区在 Django 中处于活动状态,则在提取值之前将日期时间转换为该时区。 下面的示例转换为墨尔本时区 (UTC +10:00),这会更改返回的天、工作日和小时值:

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')  # UTC+10:00
>>> with timezone.override(melb):
...    Experiment.objects.annotate(
...        day=ExtractDay('start_datetime'),
...        weekday=ExtractWeekDay('start_datetime'),
...        hour=ExtractHour('start_datetime'),
...    ).values('day', 'weekday', 'hour').get(
...        end_datetime__year=ExtractYear('start_datetime'),
...    )
{'day': 16, 'weekday': 3, 'hour': 9}

将时区显式传递给 Extract 函数的行为方式相同,并且优先于活动时区:

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> Experiment.objects.annotate(
...     day=ExtractDay('start_datetime', tzinfo=melb),
...     weekday=ExtractWeekDay('start_datetime', tzinfo=melb),
...     hour=ExtractHour('start_datetime', tzinfo=melb),
... ).values('day', 'weekday', 'hour').get(
...     end_datetime__year=ExtractYear('start_datetime'),
... )
{'day': 16, 'weekday': 3, 'hour': 9}

Now

class Now

返回执行查询时数据库服务器的当前日期和时间,通常使用 SQL CURRENT_TIMESTAMP

用法示例:

>>> from django.db.models.functions import Now
>>> Article.objects.filter(published__lte=Now())
<QuerySet [<Article: How to Django>]>

PostgreSQL 的注意事项

在 PostgreSQL 上,SQL CURRENT_TIMESTAMP 返回当前事务开始的时间。 因此为了跨数据库兼容性,Now() 使用 STATEMENT_TIMESTAMP 代替。 如果您需要交易时间戳,请使用 django.contrib.postgres.functions.TransactionNow


Trunc

class Trunc(expression, kind, output_field=None, tzinfo=None, **extra)

将一个日期截断到一个重要的部分。

当您只关心某事是否发生在特定的年、小时或日,而不是确切的秒时,那么 Trunc(及其子类)可用于过滤或聚合您的数据。 例如,您可以使用 Trunc 来计算每天的销售数量。

Trunc 取单个 expression,代表一个 DateFieldTimeFieldDateTimeField,一个 kind 代表一个日期或时间部分,以及 output_fieldDateTimeField()TimeField()DateField()。 它根据 output_field 返回日期时间、日期或时间,最多 kind 的字段设置为其最小值。 如果省略output_field,则默认为expressionoutput_field。 通常由 pytz 提供的 tzinfo 子类可以传递以截断特定时区中的值。

给定日期时间 2015-06-15 14:30:50.000321+00:00,内置的 kinds 返回:

  • “年”:2015-01-01 00:00:00+00:00
  • “季”:2015-04-01 00:00:00+00:00
  • “月”:2015-06-01 00:00:00+00:00
  • “周”:2015-06-15 00:00:00+00:00
  • “日”:2015-06-15 00:00:00+00:00
  • “小时”:2015-06-15 14:00:00+00:00
  • “分钟”:2015-06-15 14:30:00+00:00
  • “第二个”:2015-06-15 14:30:50+00:00

如果像 Australia/Melbourne 这样的不同时区在 Django 中处于活动状态,则日期时间会在值被截断之前转换为新时区。 上面示例日期中墨尔本的时区偏移为 +10:00。 此时区处于活动状态时返回的值将是:

  • “年”:2015-01-01 00:00:00+11:00
  • “季”:2015-04-01 00:00:00+10:00
  • “月”:2015-06-01 00:00:00+10:00
  • “周”:2015-06-16 00:00:00+10:00
  • “日”:2015-06-16 00:00:00+10:00
  • “小时”:2015-06-16 00:00:00+10:00
  • “分钟”:2015-06-16 00:30:00+10:00
  • “第二个”:2015-06-16 00:30:50+10:00

年的偏移量为 +11:00,因为结果过渡到夏令时。

上面的每个 kind 都有一个相应的 Trunc 子类(如下所列),通常应该使用它来代替更冗长的等效项,例如 使用 TruncYear(...) 而不是 Trunc(..., kind='year')

子类都定义为转换,但它们没有注册到任何字段,因为明显的查找名称已经被 Extract 子类保留。

用法示例:

>>> from datetime import datetime
>>> from django.db.models import Count, DateTimeField
>>> from django.db.models.functions import Trunc
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 30, 50, 321))
>>> Experiment.objects.create(start_datetime=datetime(2015, 6, 15, 14, 40, 2, 123))
>>> Experiment.objects.create(start_datetime=datetime(2015, 12, 25, 10, 5, 27, 999))
>>> experiments_per_day = Experiment.objects.annotate(
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
... ).values('start_day').annotate(experiments=Count('id'))
>>> for exp in experiments_per_day:
...     print(exp['start_day'], exp['experiments'])
...
2015-06-15 00:00:00 2
2015-12-25 00:00:00 1
>>> experiments = Experiment.objects.annotate(
...    start_day=Trunc('start_datetime', 'day', output_field=DateTimeField())
... ).filter(start_day=datetime(2015, 6, 15))
>>> for exp in experiments:
...     print(exp.start_datetime)
...
2015-06-15 14:30:50.000321
2015-06-15 14:40:02.000123

DateField 截断

class TruncYear(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'year'
class TruncMonth(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'month'
class TruncWeek(expression, output_field=None, tzinfo=None, **extra)

2.1 版中的新功能。

截断到每周一的午夜。

kind = 'week'
class TruncQuarter(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'quarter'

这些在逻辑上等同于 Trunc('date_field', kind)。 它们将日期的所有部分截断到 kind,这允许以较低的精度对日期进行分组或过滤。 expressionoutput_field 可以是 DateFieldDateTimeField

由于 DateField 没有时间分量,因此只有处理日期部分的 Trunc 子类可以与 DateField 一起使用:

>>> from datetime import datetime
>>> from django.db.models import Count
>>> from django.db.models.functions import TruncMonth, TruncYear
>>> from django.utils import timezone
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> start2 = datetime(2015, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
>>> Experiment.objects.create(start_datetime=start2, start_date=start2.date())
>>> Experiment.objects.create(start_datetime=start3, start_date=start3.date())
>>> experiments_per_year = Experiment.objects.annotate(
...    year=TruncYear('start_date')).values('year').annotate(
...    experiments=Count('id'))
>>> for exp in experiments_per_year:
...     print(exp['year'], exp['experiments'])
...
2014-01-01 1
2015-01-01 2

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> experiments_per_month = Experiment.objects.annotate(
...    month=TruncMonth('start_datetime', tzinfo=melb)).values('month').annotate(
...    experiments=Count('id'))
>>> for exp in experiments_per_month:
...     print(exp['month'], exp['experiments'])
...
2015-06-01 00:00:00+10:00 1
2016-01-01 00:00:00+11:00 1
2014-06-01 00:00:00+10:00 1

DateTimeField 截断

class TruncDate(expression, **extra)
lookup_name = 'date'
output_field = DateField()

TruncDateexpression 转换为日期,而不是使用内置的 SQL 截断函数。 它也在 DateTimeField 上注册为 __date 的转换。

class TruncTime(expression, **extra)
lookup_name = 'time'
output_field = TimeField()

TruncTimeexpression 转换为时间,而不是使用内置的 SQL 截断函数。 它也在 DateTimeField 上注册为 __time 的转换。

class TruncDay(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'day'
class TruncHour(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'hour'
class TruncMinute(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'minute'
class TruncSecond(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'second'

这些在逻辑上等同于 Trunc('datetime_field', kind)。 它们将日期的所有部分截断到 kind 并允许以较低的精度对日期时间进行分组或过滤。 expression 必须有 DateTimeFieldoutput_field

用法示例:

>>> from datetime import date, datetime
>>> from django.db.models import Count
>>> from django.db.models.functions import (
...     TruncDate, TruncDay, TruncHour, TruncMinute, TruncSecond,
... )
>>> from django.utils import timezone
>>> import pytz
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_date=start1.date())
>>> melb = pytz.timezone('Australia/Melbourne')
>>> Experiment.objects.annotate(
...     date=TruncDate('start_datetime'),
...     day=TruncDay('start_datetime', tzinfo=melb),
...     hour=TruncHour('start_datetime', tzinfo=melb),
...     minute=TruncMinute('start_datetime'),
...     second=TruncSecond('start_datetime'),
... ).values('date', 'day', 'hour', 'minute', 'second').get()
{'date': datetime.date(2014, 6, 15),
 'day': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'hour': datetime.datetime(2014, 6, 16, 0, 0, tzinfo=<DstTzInfo 'Australia/Melbourne' AEST+10:00:00 STD>),
 'minute': 'minute': datetime.datetime(2014, 6, 15, 14, 30, tzinfo=<UTC>),
 'second': datetime.datetime(2014, 6, 15, 14, 30, 50, tzinfo=<UTC>)
}

TimeField 截断

class TruncHour(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'hour'
class TruncMinute(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'minute'
class TruncSecond(expression, output_field=None, tzinfo=None, **extra)
;; kind = 'second'

这些在逻辑上等同于 Trunc('time_field', kind)。 它们将时间的所有部分截断到 kind,这允许以较低的精度对时间进行分组或过滤。 expressionoutput_field 可以是 TimeFieldDateTimeField

由于 TimeField 没有日期组件,因此只有处理时间部分的 Trunc 子类可以与 TimeField 一起使用:

>>> from datetime import datetime
>>> from django.db.models import Count, TimeField
>>> from django.db.models.functions import TruncHour
>>> from django.utils import timezone
>>> start1 = datetime(2014, 6, 15, 14, 30, 50, 321, tzinfo=timezone.utc)
>>> start2 = datetime(2014, 6, 15, 14, 40, 2, 123, tzinfo=timezone.utc)
>>> start3 = datetime(2015, 12, 31, 17, 5, 27, 999, tzinfo=timezone.utc)
>>> Experiment.objects.create(start_datetime=start1, start_time=start1.time())
>>> Experiment.objects.create(start_datetime=start2, start_time=start2.time())
>>> Experiment.objects.create(start_datetime=start3, start_time=start3.time())
>>> experiments_per_hour = Experiment.objects.annotate(
...    hour=TruncHour('start_datetime', output_field=TimeField()),
... ).values('hour').annotate(experiments=Count('id'))
>>> for exp in experiments_per_hour:
...     print(exp['hour'], exp['experiments'])
...
14:00:00 2
17:00:00 1

>>> import pytz
>>> melb = pytz.timezone('Australia/Melbourne')
>>> experiments_per_hour = Experiment.objects.annotate(
...    hour=TruncHour('start_datetime', tzinfo=melb),
... ).values('hour').annotate(experiments=Count('id'))
>>> for exp in experiments_per_hour:
...     print(exp['hour'], exp['experiments'])
...
2014-06-16 00:00:00+10:00 2
2016-01-01 04:00:00+11:00 1

数学函数

2.2 版中的新功能。


我们将在数学函数示例中使用以下模型:

class Vector(models.Model):
    x = models.FloatField()
    y = models.FloatField()

Abs

class Abs(expression, **extra)

返回一个数值字段或表达式的绝对值。

用法示例:

>>> from django.db.models.functions import Abs
>>> Vector.objects.create(x=-0.5, y=1.1)
>>> vector = Vector.objects.annotate(x_abs=Abs('x'), y_abs=Abs('y')).get()
>>> vector.x_abs, vector.y_abs
(0.5, 1.1)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Abs
>>> FloatField.register_lookup(Abs)
>>> # Get vectors inside the unit cube
>>> vectors = Vector.objects.filter(x__abs__lt=1, y__abs__lt=1)

ACos

class ACos(expression, **extra)

返回数字字段或表达式的反余弦值。 表达式值必须在 -1 到 1 的范围内。

用法示例:

>>> from django.db.models.functions import ACos
>>> Vector.objects.create(x=0.5, y=-0.9)
>>> vector = Vector.objects.annotate(x_acos=ACos('x'), y_acos=ACos('y')).get()
>>> vector.x_acos, vector.y_acos
(1.0471975511965979, 2.6905658417935308)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ACos
>>> FloatField.register_lookup(ACos)
>>> # Get vectors whose arccosine is less than 1
>>> vectors = Vector.objects.filter(x__acos__lt=1, y__acos__lt=1)

ASin

class ASin(expression, **extra)

返回数值字段或表达式的反正弦。 表达式值必须在 -1 到 1 的范围内。

用法示例:

>>> from django.db.models.functions import ASin
>>> Vector.objects.create(x=0, y=1)
>>> vector = Vector.objects.annotate(x_asin=ASin('x'), y_asin=ASin('y')).get()
>>> vector.x_asin, vector.y_asin
(0.0, 1.5707963267948966)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ASin
>>> FloatField.register_lookup(ASin)
>>> # Get vectors whose arcsine is less than 1
>>> vectors = Vector.objects.filter(x__asin__lt=1, y__asin__lt=1)

ATan

class ATan(expression, **extra)

返回一个数值字段或表达式的正切值。

用法示例:

>>> from django.db.models.functions import ATan
>>> Vector.objects.create(x=3.12, y=6.987)
>>> vector = Vector.objects.annotate(x_atan=ATan('x'), y_atan=ATan('y')).get()
>>> vector.x_atan, vector.y_atan
(1.2606282660069106, 1.428638798133829)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import ATan
>>> FloatField.register_lookup(ATan)
>>> # Get vectors whose arctangent is less than 2
>>> vectors = Vector.objects.filter(x__atan__lt=2, y__atan__lt=2)

ATan2

class ATan2(expression1, expression2, **extra)

返回 expression1 / expression2 的反正切值。

用法示例:

>>> from django.db.models.functions import ATan2
>>> Vector.objects.create(x=2.5, y=1.9)
>>> vector = Vector.objects.annotate(atan2=ATan2('x', 'y')).get()
>>> vector.atan2
0.9209258773829491

Ceil

class Ceil(expression, **extra)

返回大于或等于一个数值字段或表达式的最小整数。

用法示例:

>>> from django.db.models.functions import Ceil
>>> Vector.objects.create(x=3.12, y=7.0)
>>> vector = Vector.objects.annotate(x_ceil=Ceil('x'), y_ceil=Ceil('y')).get()
>>> vector.x_ceil, vector.y_ceil
(4.0, 7.0)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Ceil
>>> FloatField.register_lookup(Ceil)
>>> # Get vectors whose ceil is less than 10
>>> vectors = Vector.objects.filter(x__ceil__lt=10, y__ceil__lt=10)

Cos

class Cos(expression, **extra)

返回一个数值字段或表达式的余弦值。

用法示例:

>>> from django.db.models.functions import Cos
>>> Vector.objects.create(x=-8.0, y=3.1415926)
>>> vector = Vector.objects.annotate(x_cos=Cos('x'), y_cos=Cos('y')).get()
>>> vector.x_cos, vector.y_cos
(-0.14550003380861354, -0.9999999999999986)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cos
>>> FloatField.register_lookup(Cos)
>>> # Get vectors whose cosine is less than 0.5
>>> vectors = Vector.objects.filter(x__cos__lt=0.5, y__cos__lt=0.5)

Cot

class Cot(expression, **extra)

返回数值字段或表达式的正切值。

用法示例:

>>> from django.db.models.functions import Cot
>>> Vector.objects.create(x=12.0, y=1.0)
>>> vector = Vector.objects.annotate(x_cot=Cot('x'), y_cot=Cot('y')).get()
>>> vector.x_cot, vector.y_cot
(-1.5726734063976826, 0.642092615934331)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Cot
>>> FloatField.register_lookup(Cot)
>>> # Get vectors whose cotangent is less than 1
>>> vectors = Vector.objects.filter(x__cot__lt=1, y__cot__lt=1)

Degrees

class Degrees(expression, **extra)

将数值字段或表达式从弧度转换为度。

用法示例:

>>> from django.db.models.functions import Degrees
>>> Vector.objects.create(x=-1.57, y=3.14)
>>> vector = Vector.objects.annotate(x_d=Degrees('x'), y_d=Degrees('y')).get()
>>> vector.x_d, vector.y_d
(-89.95437383553924, 179.9087476710785)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Degrees
>>> FloatField.register_lookup(Degrees)
>>> # Get vectors whose degrees are less than 360
>>> vectors = Vector.objects.filter(x__degrees__lt=360, y__degrees__lt=360)

Exp

class Exp(expression, **extra)

返回 e(自然对数底)的数值字段或表达式的幂。

用法示例:

>>> from django.db.models.functions import Exp
>>> Vector.objects.create(x=5.4, y=-2.0)
>>> vector = Vector.objects.annotate(x_exp=Exp('x'), y_exp=Exp('y')).get()
>>> vector.x_exp, vector.y_exp
(221.40641620418717, 0.1353352832366127)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Exp
>>> FloatField.register_lookup(Exp)
>>> # Get vectors whose exp() is greater than 10
>>> vectors = Vector.objects.filter(x__exp__gt=10, y__exp__gt=10)

Floor

class Floor(expression, **extra)

返回不大于数值字段或表达式的最大整数值。

用法示例:

>>> from django.db.models.functions import Floor
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_floor=Floor('x'), y_floor=Floor('y')).get()
>>> vector.x_floor, vector.y_floor
(5.0, -3.0)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Floor
>>> FloatField.register_lookup(Floor)
>>> # Get vectors whose floor() is greater than 10
>>> vectors = Vector.objects.filter(x__floor__gt=10, y__floor__gt=10)

Ln

class Ln(expression, **extra)

返回一个数值字段或表达式的自然对数。

用法示例:

>>> from django.db.models.functions import Ln
>>> Vector.objects.create(x=5.4, y=233.0)
>>> vector = Vector.objects.annotate(x_ln=Ln('x'), y_ln=Ln('y')).get()
>>> vector.x_ln, vector.y_ln
(1.6863989535702288, 5.4510384535657)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Ln
>>> FloatField.register_lookup(Ln)
>>> # Get vectors whose value greater than e
>>> vectors = Vector.objects.filter(x__ln__gt=1, y__ln__gt=1)

Log

class Log(expression1, expression2, **extra)

接受两个数字字段或表达式,并返回第一个字段的对数到第二个字段的基数。

用法示例:

>>> from django.db.models.functions import Log
>>> Vector.objects.create(x=2.0, y=4.0)
>>> vector = Vector.objects.annotate(log=Log('x', 'y')).get()
>>> vector.log
2.0

Mod

class Mod(expression1, expression2, **extra)

接受两个数值字段或表达式,并返回第一个字段除以第二个字段的余数(模数运算)。

用法示例:

>>> from django.db.models.functions import Mod
>>> Vector.objects.create(x=5.4, y=2.3)
>>> vector = Vector.objects.annotate(mod=Mod('x', 'y')).get()
>>> vector.mod
0.8

Pi

class Pi(**extra)

返回数学常数 π 的值。


Power

class Power(expression1, expression2, **extra)

接受两个数值字段或表达式,并将第一个字段的值提高到第二个字段的幂。

用法示例:

>>> from django.db.models.functions import Power
>>> Vector.objects.create(x=2, y=-2)
>>> vector = Vector.objects.annotate(power=Power('x', 'y')).get()
>>> vector.power
0.25

Radians

class Radians(expression, **extra)

将数值字段或表达式从度数转换为弧度。

用法示例:

>>> from django.db.models.functions import Radians
>>> Vector.objects.create(x=-90, y=180)
>>> vector = Vector.objects.annotate(x_r=Radians('x'), y_r=Radians('y')).get()
>>> vector.x_r, vector.y_r
(-1.5707963267948966, 3.141592653589793)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Radians
>>> FloatField.register_lookup(Radians)
>>> # Get vectors whose radians are less than 1
>>> vectors = Vector.objects.filter(x__radians__lt=1, y__radians__lt=1)

Round

class Round(expression, **extra)

将数字字段或表达式四舍五入为最接近的整数。 半值是向上还是向下四舍五入取决于数据库。

用法示例:

>>> from django.db.models.functions import Round
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_r=Round('x'), y_r=Round('y')).get()
>>> vector.x_r, vector.y_r
(5.0, -2.0)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Round
>>> FloatField.register_lookup(Round)
>>> # Get vectors whose round() is less than 20
>>> vectors = Vector.objects.filter(x__round__lt=20, y__round__lt=20)

Sin

class Sin(expression, **extra)

返回一个数值字段或表达式的正弦值。

用法示例:

>>> from django.db.models.functions import Sin
>>> Vector.objects.create(x=5.4, y=-2.3)
>>> vector = Vector.objects.annotate(x_sin=Sin('x'), y_sin=Sin('y')).get()
>>> vector.x_sin, vector.y_sin
(-0.7727644875559871, -0.7457052121767203)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Sin
>>> FloatField.register_lookup(Sin)
>>> # Get vectors whose sin() is less than 0
>>> vectors = Vector.objects.filter(x__sin__lt=0, y__sin__lt=0)

Sqrt

class Sqrt(expression, **extra)

返回一个非负数值字段或表达式的平方根。

用法示例:

>>> from django.db.models.functions import Sqrt
>>> Vector.objects.create(x=4.0, y=12.0)
>>> vector = Vector.objects.annotate(x_sqrt=Sqrt('x'), y_sqrt=Sqrt('y')).get()
>>> vector.x_sqrt, vector.y_sqrt
(2.0, 3.46410)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Sqrt
>>> FloatField.register_lookup(Sqrt)
>>> # Get vectors whose sqrt() is less than 5
>>> vectors = Vector.objects.filter(x__sqrt__lt=5, y__sqrt__lt=5)

Tan

class Tan(expression, **extra)

返回一个数值字段或表达式的正切值。

用法示例:

>>> from django.db.models.functions import Tan
>>> Vector.objects.create(x=0, y=12)
>>> vector = Vector.objects.annotate(x_tan=Tan('x'), y_tan=Tan('y')).get()
>>> vector.x_tan, vector.y_tan
(0.0, -0.6358599286615808)

它也可以注册为转换。 例如:

>>> from django.db.models import FloatField
>>> from django.db.models.functions import Tan
>>> FloatField.register_lookup(Tan)
>>> # Get vectors whose tangent is less than 0
>>> vectors = Vector.objects.filter(x__tan__lt=0, y__tan__lt=0)

文本函数

Chr

class Chr(expression, **extra)

2.1 版中的新功能。


接受数字字段或表达式,并将表达式的文本表示形式作为单个字符返回。 它的工作原理与 Python 的 chr() 函数相同。

Length 一样,它可以注册为 IntegerField 上的变换。 默认查找名称是 chr

用法示例:

>>> from django.db.models.functions import Chr
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.filter(name__startswith=Chr(ord('M'))).get()
>>> print(author.name)
Margaret Smith

Concat

class Concat(*expressions, **extra)

接受至少两个文本字段或表达式的列表并返回连接的文本。 每个参数必须是文本或字符类型。 如果你想连接一个 TextField() 和一个 CharField(),那么一定要告诉 Django output_field 应该是一个 TextField()。 在连接 Value 时,也需要指定 output_field,如下例所示。

此函数永远不会有空结果。 在 null 参数导致整个表达式为 null 的后端,Django 将确保每个 null 部分首先转换为空字符串。

用法示例:

>>> # Get the display name as "name (goes_by)"
>>> from django.db.models import CharField, Value as V
>>> from django.db.models.functions import Concat
>>> Author.objects.create(name='Margaret Smith', goes_by='Maggie')
>>> author = Author.objects.annotate(
...     screen_name=Concat(
...         'name', V(' ('), 'goes_by', V(')'),
...         output_field=CharField()
...     )
... ).get()
>>> print(author.screen_name)
Margaret Smith (Maggie)

Left

class Left(expression, length, **extra)

2.1 版中的新功能。


返回给定文本字段或表达式的前 length 个字符。

用法示例:

>>> from django.db.models.functions import Left
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(first_initial=Left('name', 1)).get()
>>> print(author.first_initial)
M

Length

class Length(expression, **extra)

接受单个文本字段或表达式并返回该值具有的字符数。 如果表达式为空,则长度也将为空。

用法示例:

>>> # Get the length of the name and goes_by fields
>>> from django.db.models.functions import Length
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(
...    name_length=Length('name'),
...    goes_by_length=Length('goes_by')).get()
>>> print(author.name_length, author.goes_by_length)
(14, None)

它也可以注册为转换。 例如:

>>> from django.db.models import CharField
>>> from django.db.models.functions import Length
>>> CharField.register_lookup(Length)
>>> # Get authors whose name is longer than 7 characters
>>> authors = Author.objects.filter(name__length__gt=7)

Lower

class Lower(expression, **extra)

接受单个文本字段或表达式,并返回小写表示。

它也可以注册为一个转换,如 Length 中所述。

用法示例:

>>> from django.db.models.functions import Lower
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_lower=Lower('name')).get()
>>> print(author.name_lower)
margaret smith

LPad

class LPad(expression, length, fill_text=Value(' '), **extra)

2.1 版中的新功能。


返回用 fill_text 填充左侧的给定文本字段或表达式的值,以便结果值为 length 个字符长。 默认 fill_text 是一个空格。

用法示例:

>>> from django.db.models import Value
>>> from django.db.models.functions import LPad
>>> Author.objects.create(name='John', alias='j')
>>> Author.objects.update(name=LPad('name', 8, Value('abc')))
1
>>> print(Author.objects.get(alias='j').name)
abcaJohn

LTrim

class LTrim(expression, **extra)

2.1 版中的新功能。


类似于 Trim,但只删除前导空格。


Ord

class Ord(expression, **extra)

2.1 版中的新功能。


接受单个文本字段或表达式,并返回该表达式第一个字符的 Unicode 代码点值。 它的工作方式类似于 Python 的 ord() 函数,但如果表达式的长度超过一个字符,则不会引发异常。

它也可以注册为一个转换,如 Length 中所述。 默认查找名称是 ord

用法示例:

>>> from django.db.models.functions import Ord
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_code_point=Ord('name')).get()
>>> print(author.name_code_point)
77

Repeat

class Repeat(expression, number, **extra)

2.1 版中的新功能。


返回重复 number 次的给定文本字段或表达式的值。

用法示例:

>>> from django.db.models.functions import Repeat
>>> Author.objects.create(name='John', alias='j')
>>> Author.objects.update(name=Repeat('name', 3))
1
>>> print(Author.objects.get(alias='j').name)
JohnJohnJohn

Replace

class Replace(expression, text, replacement=Value(), **extra)

2.1 版中的新功能。


expression 中所有出现的 text 替换为 replacement。 默认替换文本是空字符串。 函数的参数区分大小写。

用法示例:

>>> from django.db.models import Value
>>> from django.db.models.functions import Replace
>>> Author.objects.create(name='Margaret Johnson')
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.update(name=Replace('name', Value('Margaret'), Value('Margareth')))
2
>>> Author.objects.values('name')
<QuerySet [{'name': 'Margareth Johnson'}, {'name': 'Margareth Smith'}]>

Reverse

class Reverse(expression, **extra)

2.2 版中的新功能。


接受单个文本字段或表达式,并将该表达式的字符按相反顺序返回。

它也可以注册为一个转换,如 Length 中所述。 默认查找名称是 reverse

用法示例:

>>> from django.db.models.functions import Reverse
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(backward=Reverse('name')).get()
>>> print(author.backward)
htimS teragraM

RPad

class RPad(expression, length, fill_text=Value(' '), **extra)

2.1 版中的新功能。


类似于 LPad,但焊盘在右侧。


RTrim

class RTrim(expression, **extra)

2.1 版中的新功能。


类似于 Trim,但只删除尾随空格。


StrIndex

class StrIndex(string, substring, **extra)

返回与 string 中第一次出现 substring 的 1 索引位置相对应的正整数,如果未找到 substring,则返回 0。

用法示例:

>>> from django.db.models import Value as V
>>> from django.db.models.functions import StrIndex
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.create(name='Smith, Margaret')
>>> Author.objects.create(name='Margaret Jackson')
>>> Author.objects.filter(name='Margaret Jackson').annotate(
...     smith_index=StrIndex('name', V('Smith'))
... ).get().smith_index
0
>>> authors = Author.objects.annotate(
...    smith_index=StrIndex('name', V('Smith'))
... ).filter(smith_index__gt=0)
<QuerySet [<Author: Margaret Smith>, <Author: Smith, Margaret>]>

警告

在 MySQL 中,数据库表的 collation 确定字符串比较(例如该函数的 expressionsubstring)是否区分大小写。 默认情况下,比较不区分大小写。


Substr

class Substr(expression, pos, length=None, **extra)

从从位置 pos 开始的字段或表达式中返回长度为 length 的子字符串。 该位置为 1 索引,因此该位置必须大于 0。 如果 lengthNone,则将返回字符串的其余部分。

用法示例:

>>> # Set the alias to the first 5 characters of the name as lowercase
>>> from django.db.models.functions import Lower, Substr
>>> Author.objects.create(name='Margaret Smith')
>>> Author.objects.update(alias=Lower(Substr('name', 1, 5)))
1
>>> print(Author.objects.get(name='Margaret Smith').alias)
marga

Trim

class Trim(expression, **extra)

2.1 版中的新功能。


返回给定的文本字段或表达式的值,并去除前导和尾部的空格。

用法示例:

>>> from django.db.models.functions import Trim
>>> Author.objects.create(name='  John  ', alias='j')
>>> Author.objects.update(name=Trim('name'))
1
>>> print(Author.objects.get(alias='j').name)
John

Upper

class Upper(expression, **extra)

接受单个文本字段或表达式,并返回大写表示。

它也可以注册为一个转换,如 Length 中所述。

用法示例:

>>> from django.db.models.functions import Upper
>>> Author.objects.create(name='Margaret Smith')
>>> author = Author.objects.annotate(name_upper=Upper('name')).get()
>>> print(author.name_upper)
MARGARET SMITH

窗口函数

Window 表达式中有许多函数可用于计算元素的等级或某些行的 Ntile

CumeDist

class CumeDist(*expressions, **extra)

计算窗口或分区内某个值的累积分布。 累积分布定义为当前行之前或与之对等的行数除以帧中的总行数。


DenseRank

class DenseRank(*expressions, **extra)

相当于 Rank 但没有间隙。


FirstValue

class FirstValue(expression, **extra)

返回在窗口框架第一行的行处计算的值,如果不存在这样的值,则返回 None


Lag

class Lag(expression, offset=1, default=None, **extra)

计算偏移offset的值,如果不存在行,则返回default

default 必须与 expression 具有相同的类型,但是,这仅由数据库验证,而不是在 Python 中验证。

MariaDB 和 default

MariaDB 不支持 default 参数。


LastValue

class LastValue(expression, **extra)

FirstValue 相比,它计算给定框架子句中的最后一个值。


Lead

class Lead(expression, offset=1, default=None, **extra)

计算给定 中的主值。 offsetdefault 都相对于当前行进行评估。

default 必须与 expression 具有相同的类型,但是,这仅由数据库验证,而不是在 Python 中验证。

MariaDB 和 default

MariaDB 不支持 default 参数。


NthValue

class NthValue(expression, nth=1, **extra)

计算相对于窗口内偏移量 nth(必须是正值)的行。 如果不存在行,则返回 None

某些数据库可能会以不同的方式处理不存在的第 n 个值。 例如,对于基于字符的表达式,Oracle 返回空字符串而不是 None。 在这些情况下,Django 不做任何转换。


Ntile

class Ntile(num_buckets=1, **extra)

为 frame 子句中的每一行计算一个分区,在 1 和 num_buckets 之间尽可能均匀地分布数字。 如果行没有均匀地分成多个桶,一个或多个桶将被更频繁地表示。


PercentRank

class PercentRank(*expressions, **extra)

计算框架子句中行的百分位等级。 此计算等效于评估:

(rank - 1) / (total rows - 1)

下表解释了行的百分位数的计算:

行 # 排名 计算 百分比排名
1 15 1 (1-1)/(7-1) 0.0000
2 20 2 (2-1)/(7-1) 0.1666
3 20 2 (2-1)/(7-1) 0.1666
4 20 2 (2-1)/(7-1) 0.1666
5 30 5 (5-1)/(7-1) 0.6666
6 30 5 (5-1)/(7-1) 0.6666
7 40 7 (7-1)/(7-1) 1.0000


Rank

class Rank(*expressions, **extra)

RowNumber 相比,此功能对窗口中的行进行排序。 计算出的排名包含差距。 使用 DenseRank 计算无间隙的秩。


RowNumber

class RowNumber(*expressions, **extra)

如果 窗口框架 没有分区,则根据框架子句的顺序或整个查询的顺序计算行号。