質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

853閲覧

djangoデータベース操作

rikupi_70

総合スコア10

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/01/26 05:22

python

1models 2class Message(models.Model): 3 to_user = models.ForeignKey(User, on_delete = models.CASCADE, related_name="to_user") 4 from_user = models.ForeignKey(User, on_delete = models.CASCADE,related_name="from_user") 5 content = models.TextField() 6 created_at = models.DateTimeField(default=datetime.now) 7 read = models.BooleanField(default=False)

python

1views 2def message_list(request,user_id): 3 ml = Message.objects.all().filter( 4 Q(to_user=user_id)| Q(from_user=user_id) 5 ).order_by('created_at') 6 j_list =[] 7 for item in ml: 8 params = {} 9 created_at = item.created_at.strftime("%Y/%m/%d %H:%M:%S") 10 params.update(id = item.id,to_user = item.to_user.id,from_user = item.from_user.id,content=item.content,created_at=created_at,read=item.read) 11 j_list.append(params) 12 print(j_list) 13 json_str = json.dumps(j_list, ensure_ascii=False, indent=2) 14 response = HttpResponse(json_str) 15 return response 16

print結果

[{'id': 4, 'to_user': 4, 'from_user': 1, 'content': 'はろー', 'created_at': '2021/01/26 04:56:35', 'read': False}, {'id': 5, 'to_user': 1, 'from_user': 4, 'content': 'てんきいいね', 'created_at': '2021/01/26 04:56:46', 'read': False}, {'id': 6, 'to_user': 2, 'from_user': 4, 'content': 'ちょうしどう', 'created_at': '2021/01/26 04:57:00', 'read': False}, {'id': 7, 'to_user': 4, 'from_user': 2, 'content': 'いいかんでぃ', 'created_at': '2021/01/26 04:57:10', 'read': False}, {'id': 9, 'to_user': 3, 'from_user': 4, 'content': 'まだねむい?', 'created_at': '2021/01/26 05:11:18', 'read': False}]

LINEのメッセージ一覧の様に自分宛のメッセージと相手宛のメッセージの早い方の一覧を取得したいのですが、
どの様にかけばよろしいのでしょうか?よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

LINEのメッセージ一覧の様に自分宛のメッセージと相手宛のメッセージの早い方の一覧を取得したい

まず、上記は、**『to_userもしくはfrom_userがuser-id(自分自身)の場合に、そのメッセージ内容を、日時の早い順に並べたい』**という認識でよろしいでしょうか?

 
質問に記載のある "print結果" は user-id = 4 のレコードを抽出したものと推測します。

  • print(j_list) の結果:

Terminal

1[{'id': 4, 'to_user': 4, 'from_user': 1, 'content': 'はろー', 'created_at': '2021/01/26 04:56:35', 'read': False}, 2 {'id': 5, 'to_user': 1, 'from_user': 4, 'content': 'てんきいいね', 'created_at': '2021/01/26 04:56:46', 'read': False}, 3 {'id': 6, 'to_user': 2, 'from_user': 4, 'content': 'ちょうしどう', 'created_at': '2021/01/26 04:57:00', 'read': False}, 4 {'id': 7, 'to_user': 4, 'from_user': 2, 'content': 'いいかんでぃ', 'created_at': '2021/01/26 04:57:10', 'read': False}, 5 {'id': 9, 'to_user': 3, 'from_user': 4, 'content': 'まだねむい?', 'created_at': '2021/01/26 05:11:18', 'read': False}]

 
user_id=4 は、相手が1,2,3と会話しています。
1,2,3のいずれかとの会話のみを抽出する場合、たとえばそれが1ならば、
『「to_user=自分(4) かつ 相手(from_user)=1」 もしくは 「from_user=自分(4) かつ 相手(to_user)=1」』
という条件になりますよね。

このことから、以下のように記述してみてはいかがでしょうか。

python

1# views.py 2 3def message_list(request,user_id,partner_id): # 相手のユーザーidをpartner_idと置く 4 ml = Message.objects.all().filter( 5 Q(to_user=user_id,from_user=partner_id)| Q(from_user=user_id,to_user=partner_id) # and条件で相手のユーザーidを指定する 6 ).order_by('created_at') 7 j_list =[] 8# 以下、同じ

投稿2021/01/27 00:47

_whitecat_22

総合スコア1305

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rikupi_70

2021/01/29 04:46

できました!ありがとうございました!
_whitecat_22

2021/01/29 05:02

嬉しい報告をありがとうございます!^^ お役に立てて良かったです 開発、がんばってくださいね~
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問