)DateTimeFieldから年を抽出する正しい方法は何ですか?Django DateTimeFieldから値を取得する年(
class Article(models.Model):
title = models.CharField(_('title'), max_length=250)
slug = models.SlugField(_('slug'), max_length=250, unique=True, default='', blank=True)
content = models.TextField(_('content'))
author = models.ForeignKey(settings.AUTH_USER_MODEL)
categories = models.ManyToManyField(Category)
tags = models.ManyToManyField(Tag)
created = models.DateTimeField(_('created'), default=timezone.now)
publish_date = models.DateTimeField(_('publish date'), blank=True, null=True)
STATUS_ARTICLE = (
('DRAFT', _('draft')),
('PUBLISHED', _('published'))
)
status = models.CharField(_('status'), max_length=100, choices=STATUS_ARTICLE, default='DRAFT')
class ExtractMonth(Func):
template = "EXTRACT(MONTH FROM %(expressions)s)"
def __init__(self, *expressions, **extra):
extra['output_field'] = models.SmallIntegerField()
super().__init__(*expressions, **extra)
はすべての年のリストを取得しようとすると、年ごとの記事数:
例は、与えられた
これは、次のエラーが発生しresult = Article.objects.filter(status='PUBLISHED').annotate(Year=ExtractYear('publish_date')).values('Year').annotate(dcount=Count('Year'))
:
near "FROM": syntax error
結果のクエリは次のとおりです。
SELECT EXTRACT(YEAR FROM "articles_article"."publish_date") AS "Year", COUNT(EXTRACT(YEAR FROM "articles_article"."publish_date")) AS "dcount" FROM "articles_article" WHERE "articles_article"."status" = PUBLISHED GROUP BY EXTRACT(YEAR FROM "articles_article"."publish_date"), "articles_article"."created" ORDER BY "articles_article"."created" DESC
これは、単純なユースケースと思われるものに対する複雑な解決策のようです。 datetimefieldから年を抽出しても、開発者はカスタムSQLを記述する必要はありません。また、どのモジュールで "Func"が定義されていますか? –
推奨される解決策は機能しません。次のエラーが発生しました: "FROM"の近く:構文エラー –
これは生成されているクエリです。これはsqliteデータベースでローカルにテストしています:SELECT EXTRACT(YEAR FROM "articles_article"。 "publish_date")AS "Year" "ステータス" = EXTRACTによって発行されたグループ(「articles_article」から「publish_date」)、「articles_article」、「articles_article」、「articles_article」、「articles_article」、 "作成" ORDER BY "articles_article"。 "作成" DESC –