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

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

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

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

Python

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

Q&A

解決済

1回答

2282閲覧

Django: データベース操作

退会済みユーザー

退会済みユーザー

総合スコア0

Django

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

Python

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

0グッド

0クリップ

投稿2020/03/15 05:51

編集2020/03/17 03:09

実現したいこと

statusがMember(ログイン時のユーザ)が保持しているstatus(複数の可能性あり)である記事を取り出したいと思っています。
しかし、下記エラーが発生してしまいます。
どのようにすれば解決出来るのか教えて頂けると幸いです。
可能性のみでもお願いします。
よろしくお願いいたします。

発生している問題・エラーメッセージ

error

1ValueError: invalid literal for int() with base 10: 'Vlog'

該当のソースコード

views

1class BlogList(LoginRequiredMixin, TemplateView): 2 model = Member 3 template_name = 'blog/list.html' 4 5 def get_context_data(self, **kwargs): 6 context = super().get_context_data(**kwargs) 7 member = Member.objects.get(user=self.request.user) 8 context['member'] = member 9 10 context['all_posts'] = Post.objects.filter(status=member.status) 11 12 return context

models

1class Status(models.Model): 2 name = models.CharField(max_length=140, blank=True) 3 4 def __str__(self): 5 return self.name 6 7class Post(models.Model): 8 title = models.CharField(max_length=140) 9 summary = models.TextField(blank=True) 10 contents = MarkdownxField() 11 status = models.ForeignKey(Status, on_delete=models.SET_NULL, null=True) 12 13 # 管理者画面での表示 14 def __str__(self): 15 return self.title 16 17 # 管理者画面でのプレビュー表示 18 def formatted_markdown(self): 19 return markdownify(self.contents) 20 21class Member(models.Model): 22 name = models.CharField(max_length=140) 23 mail = models.EmailField(max_length=140) 24 status = models.ManyToManyField(Status) 25 user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) 26 27 def __str__(self): 28 return self.name

試したこと

views

1context['all_posts'] = Post.objects.filter(status=member.status.all())

ではこの段階では上手くいくが、

list

1{% for post in all_posts %} 2{% endfor %}

で以下のエラーが発生してしまう。

error

1The QuerySet value for an exact lookup must be limited to one result using slicing.

補足情報

python3.7.2

さらなる情報追加

list

1<!DOCTYPE html> 2<html> 3<head> 4 5</head> 6<body> 7 {% for member_status in member.status.all %} 8 <p>{{ member_status }}</p> 9 {% endfor %} 10 {% for post in all_posts %} 11 <div><a href="{% url 'blog:index' post.id %}">{{ post.summary }}</a></div> 12 <p>{{ post.status }}</p> 13 {% endfor %} 14</body> 15</html>

views

1def get_context_data(self, **kwargs): 2 context = super().get_context_data(**kwargs) 3 member = Member.objects.get(user=self.request.user) 4 context['member'] = member 5 6 status_list = ['Vlog', 'Beginner'] 7 context['all_posts'] = Post.objects.filter(status=status_list) 8 #print(Post.objects.all().values()) 9 return context

上記の場合のエラー画面
上記の場合のエラー画面

views

1def get_context_data(self, **kwargs): 2 context = super().get_context_data(**kwargs) 3 member = Member.objects.get(user=self.request.user) 4 context['member'] = member 5 6 #status_list = ['Vlog', 'Beginner'] 7 #context['all_posts'] = Post.objects.filter(status=status_list) 8 print(Post.objects.all().values()) 9 return context

上記の場合の実行結果
上記の場合の実行結果

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

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

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

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

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

llr114

2020/03/16 17:53

context['all_posts'] = Post.objects.filter(status=member.status.all()) と return context の間で print(context['all_posts']) をして、その出力内容を教えていただけないでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/17 01:40

返信の程、ありがとうございます。 ValueError at /blog/list The QuerySet value for an exact lookup must be limited to one result using slicing. と出力されてエラーが発生してしまいます。
llr114

2020/03/17 01:50

context['all_posts'] = Post.objects.filter(status=member.status.all()) でエラーが発生しているということでしょうか? 試しに、 status_list = ['']#ここにはいくつかのステータスの例を入力 context['all_posts'] = Post.objects.filter(status=status_list) としてやってみて、どうなるか確認いただけないでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/17 02:48

TypeError at /blog/list int() argument must be a string, a bytes-like object or a number, not 'list' と出力されます。 context['all_posts'] = Post.objects.filter(status=member.status.all())がダメな気がします。
llr114

2020/03/17 02:58

エラーが画面のException Locationの値を教えて頂いてもよろしいでしょうか? また、 print(Post.objects.all().values()) をした時の値も教えてください。
guest

回答1

0

ベストアンサー

編集ありがとうございます。
print(Post.objects.all().values())
の結果を見ると、中身が"status"ではなくて、"status_id"になっているので、

python

1status_list = [1, 2] 2context['all_posts'] = Post.objects.filter(status=status_list)

などにするとうまくいくかもしれません。

なので、最終的な形としては

python

1status_list = Status.objects.values_list('id', flat=True) #ステータスのIDをリストで取得 2context['all_posts'] = Post.objects.filter(status=status_list)

で、できないでしょうか、、?

投稿2020/03/17 04:36

編集2020/03/17 04:49
llr114

総合スコア203

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

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

退会済みユーザー

退会済みユーザー

2020/03/17 04:46

以下のようにしても見たのですが、 for i, member_status in enumerate(member.status.all()): if i == 0: context['all_posts'] = Post.objects.get(status=Status.objects.get(name=member_status)) else: context['all_posts'] += Post.objects.get(status=Status.objects.get(name=member_status)) 付け足すことが出来ずにダメでした。
退会済みユーザー

退会済みユーザー

2020/03/17 04:49

context['all_posts'] = Post.objects.filter(status_id=member.status) 上記のように変更しても、 TypeError at /blog/list int() argument must be a string, a bytes-like object or a number, not 'ManyRelatedManager' 上記エラーが発生してしまいます。
llr114

2020/03/17 04:49

回答が全部送れていませんでした。申し訳ないです。 一度、そちらを確認して頂いてもよろしいでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/17 05:03

本当に何度も何度も申し訳ございません。 status_list = [1, 2] context['all_posts'] = Post.objects.filter(status=status_list) で下記エラーが発生してしまいます。 TypeError at /blog/list int() argument must be a string, a bytes-like object or a number, not 'list'
llr114

2020/03/17 06:37

context['all_posts'] = Post.objects.filter(status__in=status_list) だとどうでしょうか、、、?
退会済みユーザー

退会済みユーザー

2020/03/17 06:44

出来ました!!!!!!!! 本当に何度も何度も申し訳ございませんでした。 おかげさまで、無事期待する値を得ることが出来ました。 ありがとうございました。
llr114

2020/03/17 06:47

いえいえ、良かったです! また何かありましたら、お気軽にどうぞ!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問