<blockquote>
<p><strong>Q 1.</strong> How alias queries done in Django ORM?</p>
</blockquote>
<p>通过使用<strong>QuerySet的<a href="https://docs.djangoproject.com/en/dev/ref/models/querysets/#annotate" rel="nofollow noreferrer"><strong>^{<cd1>}</strong> (Django Doc)</a>方法</strong></p>
<blockquote>
<p><strong>Q 2.</strong> Why property not accessed in Django managers?</p>
</blockquote>
<p>因为模型管理器(更准确地说,<code>QuerySet</code>)正在包装在<em><strong>数据库中所做的事情。您也可以将模型管理器作为高级数据库包装器调用</p>
<p>但是,属性<strong><code>college_end_date</code></strong>仅在模型类中定义,数据库不知道它,因此会出现错误</p>
<blockquote>
<p><strong>Q 3.</strong> How to write manager to filter records based on the field which is not in models, but can be calculated using fields present in the model?</p>
</blockquote>
<p>使用<strong><code>annotate(...)</code></strong>方法是正确的Django方法。作为旁注,复杂的属性逻辑不能用<strong><code>annotate(...)</code></strong>方法重新创建</p>
<p>在您的情况下,我会将<strong><code>college_duration</code></strong>字段从<strong><code>IntegerField(...)</code></strong>更改为<a href="https://docs.djangoproject.com/en/dev/ref/models/fields/#durationfield" rel="nofollow noreferrer"><strong>^{<cd8>}</strong> (Django Doc)</a>,因为它(对我)更有意义</p>
<p>稍后,更新您的经理和属性,如下所示:</p>
<pre><code>from django.db import models
from django.utils import timezone
class StudentManager(models.Manager):
<b>def passed_students(self):
default_qs = self.get_queryset()
college_end = models.ExpressionWrapper(
models.F('join_date') + models.F('college_duration'),
output_field=models.DateField()
)
return default_qs \
.annotate(college_end=college_end) \
.filter(college_end__lt=timezone.now().date())</b>
class Student(models.Model):
join_date = models.DateTimeField()
college_duration = models.DurationField()
objects = StudentManager()
@property
def college_end_date(self):
# return date by summing the datetime and timedelta objects
return <b>(self.join_date + self.college_duration).date()</b></code></pre>
<p><strong>注意:</strong></p>
<ul>
<li><p><code>DurationField(...)</code>将在PostgreSQL中按预期工作,此实现将在PSQL中按<em>的方式工作。如果正在使用任何其他数据库,您可能会遇到问题。如果是这样,您可能需要有一个<em>“数据库功能”</em>,该功能在与特定数据库对应的日期时间和持续时间数据集上运行</p>
</li>
<li><p>就我个人而言,我喜欢<a href="https://stackoverflow.com/a/64303306/12578202">this solution</a></p>
</li>
</ul>