teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

2

補足追加

2020/12/10 14:43

投稿

exnjinia
exnjinia

スコア16

title CHANGED
File without changes
body CHANGED
@@ -1,18 +1,22 @@
1
- python djangoでデータベースの値取得できません
1
+ python djangoでpkを使用したデータベースの値取得の方法と、それを文字列に変換する方法を教えてください
2
2
 
3
3
  ・python(django)をherokuで動かしています。
4
4
  ・LINE Messaging APIを使用し、最後はLINEに返信するLINE BOTを作成しています。
5
- ・データベースから値を取得したいのですが、QuerySet取得した、それを値として返ことでき困っています。
5
+ ・データベースから値を取得し、文字列にしてLINEに返したいのですが、pk使用したデータの取得と、それを文字列に変換る方法わからず困っています。
6
+ ・heroku上でのデータベースはPostgreSQLです。
6
7
 
7
- heroku上でのデータベースはPostgreSQLです。
8
-
9
8
  ●モデルは次のとおりです。
10
9
  ```python
11
10
  from django.db import models
12
11
 
12
+ CATEGORY = (('owarai','笑い系'),('majime','真面目系'),('skill','技術論系'),('item','アイテム系'),('others','その他'))
13
13
  class SampleModel(models.Model):
14
14
  article_name = models.CharField(max_length=200)
15
15
  article_url = models.TextField()
16
+ category = models.CharField(
17
+ max_length = 50,
18
+ choices = CATEGORY
19
+ )
16
20
 
17
21
  def __str__(self):
18
22
  return self.article_name
@@ -32,55 +36,22 @@
32
36
  num = SampleModel.objects.all().count()
33
37
  setnum = random.randint(1, int(num))
34
38
 
35
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
36
39
  ob = SampleModel.objects.filter(pk=setnum)
37
40
  result = str(ob)
38
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
39
41
 
40
42
  return result
41
43
 
42
44
  ```
43
45
 
44
46
  LINE BOTなので、resultの値をLINEに返却します。
45
-
46
- のとLINEから適当な文字入力すると、reslutの結果として、LINEには
47
+ しかし、上記pk=setnumいうpk使用したデータの取り出しを行うと、reslutの結果として、LINEには
48
+ ```ここに言語を入力
47
49
  <QuerySet[]>
48
- という返信がきます。
49
-
50
- データベース自体にはつながっていると思うので、このQuerysetからarticle_name(ブログの記事名)を取り出したいのですが、うまくいきません。
51
- 調べた限りで以下のいくつかの方法を試してみましたが、値を取得することができません。(既読だけついて何も返信がなく終了します)
52
-
53
- ※上記コード中、コメントで囲まれた部分だけを次のとおり変更して試しました
54
- ※【result = str(ob)】の部分は、すべて【result = ob】と【result = ob.article_name】でも試しています。
55
- ```python
56
- #①・・・・・・・・・・・・・・・・・・・・・・・・・・・・
57
- ob = SampleModel.objects.values_list('article_name',flat=True).get(pk=setnum)
58
- result = str(ob)
59
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
60
-
61
- #②・・・・・・・・・・・・・・・・・・・・・・・・・・・・
62
- ob = SampleModel.objects.get(pk=setnum)
63
- result = str(ob)
64
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
65
-
66
- #③・・・・・・・・・・・・・・・・・・・・・・・・・・・・
67
- ob = SampleModel.objects.values_list('article_name).get(pk=setnum)
68
- result = str(ob)
69
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
70
-
71
- #④・・・・・・・・・・・・・・・・・・・・・・・・・・・・
72
- ob = SampleModel.objects.filter(pk=setnum)
73
- ob_a = list(ob.values())
74
- result = ob_a["article_name"]
75
- #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
76
50
  ```
51
+ という文字列だけが返信としてきてしまいます。
52
+ ※pkの代わりにid=setnumを使用してもダメでした。
77
53
 
78
- ①〜④いずれもLINE何も返ってこい(=既読だけがつい返信がない)という状態で
54
+ しかし、次のよう、pkではく、categoryを使用しデータを取り出と、
79
-
80
- ローカル環境でprintデバッグをしたところ、コンソールにarticle_nameの値が表示されたのですが、heroku上で動かすとダメです。
81
-
82
- なお、次のコードで試すと、1からデータ登録件数の間のランダムな数値がLINEに表示されるという想定通りの動作をしてくれます。
83
-
84
55
  ```python
85
56
  from django.views.generic import ListView
86
57
  from .models import SampleModel
@@ -89,12 +60,29 @@
89
60
  num = SampleModel.objects.all().count()
90
61
  setnum = random.randint(1, int(num))
91
62
 
63
+ ob = SampleModel.objects.filter(category='owarai')
92
- return setnum
64
+ result = str(ob)
93
65
 
66
+ return result
67
+
94
68
  ```
95
69
 
70
+ resultの結果として
96
- ①〜④のコード
71
+ ```ここに言語入力
72
+ <QuerySet[<SampleModel:ブログ1>,<SampleModel:ブログ2>,<SampleModel:ブログ3>,]>
73
+ ```
74
+ という文字列がLINEに表示されます。
97
- setnum = random.randint(1, int(num))
75
+ どうやら、categoryを使用すると,データは取得できているようです。
98
- の後に入れ込むとLINEに何も返事が返ってこない(既読がつくだけで終了)ことから、①〜④のコードが原因でheroku上でコケてエラーになってしまっていることは想定できるのですが、解決方法がわからずにいます。
99
76
 
77
+ しかし、この先、たとえば取得できたこの3つのデータの中から一つを取り出し、文字列としてLINEに返す方法がわかりません。
78
+ dict型への変換などをしてみたのですが、それをした途端、LINEには一切返信が来なくなります(既読だけついて終了。)
79
+
80
+
100
- どなたか教えていただけないでしょうか。
81
+ 長々と書いてしまいましが、以下2点についてご存知の方どうか教えていただけないでしょうか。
82
+
83
+ ①:Pk(またはid)を用いて一意のデータを取得する方法
84
+ ②:①で取得したデータを文字列でLINEに返す方法(そのための変換・取り出し方法)
85
+ 返信例:「これは <ブログ1> の記事です。カテゴリは <笑い系> です。URLは<URL>です」
86
+ ※<>内はデータベースから取得した値。
87
+
88
+ よろしくお願いいたします。

1

補足追加

2020/12/10 14:43

投稿

exnjinia
exnjinia

スコア16

title CHANGED
File without changes
body CHANGED
@@ -1,7 +1,8 @@
1
1
  python djangoでデータベースの値が取得できません。
2
2
 
3
- python(django)をherokuで動かしています。
3
+ python(django)をherokuで動かしています。
4
+ ・LINE Messaging APIを使用し、最後はLINEに返信するLINE BOTを作成しています。
4
- データベースから値を取得したいのですが、QuerySetを取得した後、それを値として返すことができずに困っています。
5
+ データベースから値を取得したいのですが、QuerySetを取得した後、それを値として返すことができずに困っています。
5
6
 
6
7
  heroku上でのデータベースはPostgreSQLです。
7
8
 
@@ -18,7 +19,9 @@
18
19
  ```
19
20
 
20
21
  このモデル中で、今回はarticle_name(ブログの記事名を格納)を取得したいと考えています。
22
+ 「あ」でも「1」でも「わわわわわ」でも、言葉はなんでもいいので、とにかくLINEに文字を入力して送信するとブログの記事名が返ってくるBOTです。
21
23
 
24
+
22
25
  ●値を取得する関数は次のとおりです。
23
26
  (存在するデータのうち、ランダムで1つを取り出すことを想定しています)
24
27
  ```python
@@ -38,12 +41,14 @@
38
41
 
39
42
  ```
40
43
 
44
+ LINE BOTなので、resultの値をLINEに返却します。
45
+
41
- このとき、reslutの結果
46
+ このとき、LINEから適当な文字を入力すると、reslutの結果としてLINEには
42
47
  <QuerySet[]>
43
- 表示されます。
48
+ いう返信がきます。
44
49
 
45
- データベース自体にはつながっていると思うので、このQuerysetからデータ(article_name)を取り出したいのですが、うまくいきません。
50
+ データベース自体にはつながっていると思うので、このQuerysetからarticle_name(ブログの記事名)を取り出したいのですが、うまくいきません。
46
- 調べた限りでいくつかの方法を試してみましたが、値を取得することができません。
51
+ 調べた限りで以下のいくつかの方法を試してみましたが、値を取得することができません。(既読だけついて何も返信がなく終了します)
47
52
 
48
53
  ※上記コード中、コメントで囲まれた部分だけを次のとおり変更して試しました
49
54
  ※【result = str(ob)】の部分は、すべて【result = ob】と【result = ob.article_name】でも試しています。
@@ -70,10 +75,12 @@
70
75
  #・・・・・・・・・・・・・・・・・・・・・・・・・・・・
71
76
  ```
72
77
 
78
+ ①〜④いずれもLINEに何も返ってこない(=既読だけがついて返信がない)という状態です。
73
79
 
74
- なお、次のコ試すと、想定通りの動作(1からデタ登録件数間のランダムな数値が返却される)はしています。
80
+ カル環境printデバッグをしたころコンソルにarticle_nameの値が表示されたのでが、heroku上で動かすとダメです
75
- やはり正常にデータベースにはつながっていると思うのですが、値を取り出し、リターンすることができません。
76
81
 
82
+ なお、次のコードで試すと、1からデータ登録件数の間のランダムな数値がLINEに表示されるという想定通りの動作をしてくれます。
83
+
77
84
  ```python
78
85
  from django.views.generic import ListView
79
86
  from .models import SampleModel
@@ -86,4 +93,8 @@
86
93
 
87
94
  ```
88
95
 
96
+ ①〜④のコードを
97
+ setnum = random.randint(1, int(num))
98
+ の後に入れ込むとLINEに何も返事が返ってこない(既読がつくだけで終了)ことから、①〜④のコードが原因でheroku上でコケてエラーになってしまっていることは想定できるのですが、解決方法がわからずにいます。
99
+
89
- どなたか値取得の教えていただけないでしょうか。
100
+ どなたか教えていただけないでしょうか。