Qual è il modo corretto per estrarre l'anno da un DateTimeField?Ottieni anno da Django DateTimeField con valori()
Esempio dato:
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)
Cercando di ottenere un elenco di tutti gli anni, e il numero di articoli l'anno:
result = Article.objects.filter(status='PUBLISHED').annotate(Year=ExtractYear('publish_date')).values('Year').annotate(dcount=Count('Year'))
Il risultato è il seguente errore:
near "FROM": syntax error
La query risultante è:
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
Questa sembra una soluzione complicata a quello che dovrebbe essere un caso d'uso semplice. Estrarre l'anno da un campo datetime non dovrebbe richiedere a uno sviluppatore di scrivere SQL personalizzato. Inoltre, in quale modulo è definito "Func"? –
La soluzione suggerita non funziona.Si è verificato il seguente errore: vicino a "FROM": errore di sintassi –
Questa query viene generata, la sto testando localmente sul database sqlite: SELECT EXTRACT (ANNO DA "articles_article". "Publish_date") AS "Year", COUNT (ESTRATTO (ANNO DA "articles_article". "Publish_date")) AS "dcount" FROM "articles_article" DOVE "articles_article". "Status" = GRUPPO PUBBLICATO PER ESTRATTO (ANNO DA "articles_article". "Publish_date"), "articles_article "." creato "ORDER BY" articles_article "." creato "DESC –