6

Djangoモデルで特定の年で正常にフィルタリングできますが、ユーザーがアクセスできるように有効な年を一覧表示する方法を見つけるのに問題があります。

「datetime」フィールドが定義されたdjangoモデルがあります。元々は「date」という名前でした。私のテンプレートでは、「bar.date.date.year」フィールドに正常にアクセスできるので、それが存在することはわかっていますが、次の関数を試してみると...

blog_years=[]
for entry in blog_entries:
    if entry.date.date.year not in blog_years:
        blog_years.append(entry.date.date.year)

「'builtin_function_or_method'オブジェクトには属性'year'がありません」と言われています

私は、私がよく知らないPythonのある側面につまずいたとしか思えませんが、それが何であるかを理解することはできません。構文的でなければならないことは確かですが、それを超えて...

4

7 に答える 7

6

Postgresを使用している場合は、次のことができます

  BlogEntry.objects.extra(select={"year": "EXTRACT(YEAR FROM date)"}).distinct().values_list("year", flat=True)
于 2014-04-03T21:42:48.700 に答える
5

Pythonsetでは重複が許可されていないため、異なる年のリストが必要な場合は次のようにします。

blog_years = list(set([entry.date.year for entry in blog_entries]))

または、次を使用できますdistinct()

blog_years = blog_entries.distinct(entry__date__year).values(entry__date__year)

もちろん、モデルに基づいて上記を調整してください。

于 2012-10-27T14:55:29.347 に答える
3

1 つ目.dateは、datetime オブジェクトにアクセスします。

2 つ目.dateは、日付オブジェクトを返すが、それを呼び出さない datetime オブジェクトのメソッドにアクセスすることです (この手順は不要です)。

最後の部分 (あなたが書いた方法) は、date メソッド呼び出しの結果の属性にyearアクセスする代わりに、date メソッドの属性にアクセスしようとしています。year

違いを見るためにコードを修正すると、次のようになります...

blog_years=[]
for entry in blog_entries:
    if entry.date.date().year not in blog_years:
        blog_years.append(entry.date.date().year)

しかし、あなたがすべきことはもっとこのようなものです...

blog_years=[]
for entry in blog_entries:
    if entry.date.year not in blog_years:
        blog_years.append(entry.date.year)

datetime オブジェクトにも date 属性があるためです。

于 2012-04-18T18:02:34.487 に答える
1

date()datetimeの使用方法です

blog_years=[]
for entry in blog_entries:
    if entry.date.date().year not in blog_years:
        blog_years.append(entry.date.date().year)
于 2012-04-18T18:02:45.310 に答える
1

django 1.10から非常にシンプルになりました

from django.db.models.functions import ExtractYear 

blog_years= blog_entries.annotate(
      year=ExtractYear('created_on')
).values_list('year', flat=True)
blog_years = sorted(set(blog_years), reverse=True)
于 2017-11-04T04:19:30.213 に答える
0

期待どおりではない可能性があります (ブログ投稿のない年が返される可能性があります)。

from datetime import date
from django.db.models import Min

def blog_years():
    current_year = date.today().year
    queryset = Entry.objects.annotate(Min('date')).order_by('date')
    if queryset:
        oldest_year = queryset[0].date.date().year
    else:
        oldest_year = current_year
    return range(oldest_year, current_year + 1)
于 2012-10-27T14:46:31.720 に答える