LoginSignup
1
1

More than 3 years have passed since last update.

Djangoで目的の日時のデータを抽出したかっただけの話

Last updated at Posted at 2020-07-07

初投稿です

目的の日時のデータを抽出したかった

 タイトルの通りDjangoで特定の日時のデータを取得しようとして四苦八苦した話です。
 目的の処理ができるまでに丸一日費やしてしまったのでこの苦労を忘れないように備忘録として、またこの記事を見た人が同じようなことをするときの苦しみを減らせたらと思い投稿しました。

・DateTimeField に filter をかけるときに month や day を指定するにはどうしたらいいんだ?

 といった悩みを持っている人には少しは参考になるかもしれません。
 

models.py
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
urls.py
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で指定した日に投稿した文章をすべて取得しようとしました。

どうしたか

 結論としてビューを以下のように書けばテンプレートにデータを送れることがわかりました。

views.py
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)
index.html
<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を記述しても環境によってはうまく動作してくれません。その場合はタイムゾーンの設定を変えればうまく動作するかもしれません。

setting.py

TIME_ZONE = 'Asia/Tokyo'

USE_TZ = True

 私の場合はsettingのタイムゾーンに関する設定を以上のように行いタイムゾーンを日本に設定したらうまく動作するようになりました。

おわりに

 この記事が少しでも誰かの役に立ったら幸いです。
 まだプログラミングもQiitaも初心者なので色々至らぬ点が多いかもしれませんが、今後も積極的にアウトプットを続けていきたいです。
 「ここがおかしいぞ」や「もっとこうするといいよ!」といったアドバイスがございましたら、コメントしていただけると嬉しいです。

参考文献

 ・ウェブディー株式会社 / サービス / BLOG / Django フィールドルックアップの使い方
  https://webty.jp/staffblog/production/post-1263/

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1