【发布时间】:2019-09-23 16:56:48
【问题描述】:
我正在尝试根据促销进行一些复杂的排序:自创建以来每 7 天促销一篇文章(文章在 30 天后过期)。
我的方法是使用自创建以来的天数来注释查询集,但在我的代码中,注释字段 (days_since_creation) 的值始终为 0。
from datetime import timedelta
from django.test import TestCase
from django.db.models import ExpressionWrapper, F
from django.db.models.fields import IntegerField
from django.utils import timezone
from .models import Article
# class Article(models.Model):
# title = models.CharField(max_length=150)
# creation_date = models.DateTimeField()
#
# def __str__(self):
# return self.title
class ArticleTestCase(TestCase):
def test_days_since_creation(self):
now = timezone.now()
objects_data = [
Article(
title='Alrp',
creation_date=(now - timedelta(days=5)) # 5 days ago
),
Article(
title='Bopp',
creation_date=(now - timedelta(days=7)) # 7 days ago
),
Article(
title='Crkp',
creation_date=(now - timedelta(days=14)) # 14 days ago
),
]
Article.objects.bulk_create(objects_data)
article_set = Article.objects\
.annotate(
days_since_creation=ExpressionWrapper(
now - F('creation_date'),
output_field=IntegerField()
)
)
for article in article_set:
print(article.days_since_creation)
# all 3 objects print "0"
我希望每个对象的值分别为 5、7、14。我什至尝试过DurationField,但它只打印了 0:00:00。
之后,如果days_since_past 的值在[0, 7, 14, 21, 28,] 或1 中,我将再次使用order 字段注释查询集,否则为1,然后order_by('order')。
【问题讨论】:
-
我找到了与您的问题相关的答案:Django How to mock datetime.now for unit testing
-
@Mikey 它到底有什么关系?我不认为问题出在
now函数上。我打印了日期时间来检查它们的值,一切都是正确的。
标签: django datetime django-queryset annotate