初投稿です
#目的の日時のデータを抽出したかった
タイトルの通りDjangoで特定の日時のデータを取得しようとして四苦八苦した話です。
目的の処理ができるまでに丸一日費やしてしまったのでこの苦労を忘れないように備忘録として、またこの記事を見た人が同じようなことをするときの苦しみを減らせたらと思い投稿しました。
・DateTimeField に filter をかけるときに month や day を指定するにはどうしたらいいんだ?
といった悩みを持っている人には少しは参考になるかもしれません。
from django.db import models
class Article(models.Model):
user_id = models.IntegerField()
wirriten_date = models.DateTimeField()
text = models.CharField(max_length=255)
def __str__(self):
return self.text
from django.urls import path
from . import views
urlpatterns = [
path('<int:user_id>/<int:date_delta>/', views.index, name=index),
# ここで date_delta 今から何日前のものを取得するかを指定します。
]
このようにmodelsとurlsを定義したとき、user_idで指定したユーザーがdate_deltaで指定した日に投稿した文章をすべて取得しようとしました。
#どうしたか
結論としてビューを以下のように書けばテンプレートにデータを送れることがわかりました。
from django.shortcuts import render
from .models import Article
from datetime
def index(request, user_id, date_delta):
date_now = datetime.datetime.now()
wrriten_date = date_now - datetime.timedelta(days=date_delta)
article = Article.objects.filter(user_id=user_id, menu_date__month=menu_date.month, menu_date__day=menu_date.day)
context = {
'article': article,
}
return render(request, 'myapp/index.html', context)
<p>
{{ article.1.text }}
<!-- 注意! article[1]としたらerrorになる -->
</p>
一番困ったのはArticle.objectsのfilterメソッド条件をどのように書くかでした。
menu_dateのあとの__ month と__ day はルックアップフィールドというもので、モデルの変数名につけると条件を加えることができます。
ルックアップフィールドについては以下の記事を見て知りました。
・ウェブディー株式会社/サービス/BLOG/Django フィールドルックアップの使い方
https://webty.jp/staffblog/production/post-1263/
テンプレートで各データにアクセスするときは上のように " .データ番号 " とすることで各データにアクセスできます。
#タイムゾーンの設定
前項のようにviewsを記述しても環境によってはうまく動作してくれません。その場合はタイムゾーンの設定を変えればうまく動作するかもしれません。
TIME_ZONE = 'Asia/Tokyo'
USE_TZ = True
私の場合はsettingのタイムゾーンに関する設定を以上のように行いタイムゾーンを日本に設定したらうまく動作するようになりました。
#おわりに
この記事が少しでも誰かの役に立ったら幸いです。
まだプログラミングもQiitaも初心者なので色々至らぬ点が多いかもしれませんが、今後も積極的にアウトプットを続けていきたいです。
「ここがおかしいぞ」や「もっとこうするといいよ!」といったアドバイスがございましたら、コメントしていただけると嬉しいです。
#参考文献
・ウェブディー株式会社 / サービス / BLOG / Django フィールドルックアップの使い方
https://webty.jp/staffblog/production/post-1263/