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

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

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

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

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

0回答

1083閲覧

フォロー機能でのエラー AttributeError: 'str' object has no attribute '_meta' を解決したい

momonga8316

総合スコア2

Django

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

HTTPS

HTTPS(Hypertext Transfer Protocol Secure)はHypertext Transfer プロトコルとSSL/TLS プロトコルを組み合わせたものです。WebサーバとWebブラウザの間の通信を暗号化させて、通信経路上での盗聴や第三者によるなりすましを防止します。

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2021/10/03 12:49

前提・実現したいこと

フォロー機能を実装したいです。
初めに、フォロー機能を実装させたいが、RedirectでReverseエラーが出るでフォロー機能は実装できていましたが、ModelsのProfileにfollower,followeeのManytoManyフィールドを設定してないが故に、フォロー機能自体はできても、実際にフォローした人の人数を増やしたり、フォロワー一覧を表示したりなど、追加の機能をつけようとした時につまづいてしまいました。
(つまり、ManytoManyテーブルを作る前に中間テーブルとなるRelationテーブルだけ作ってしまった。)

そこで、新たにModels.pyのprofileテーブルに、followeeとfollowerの情報を追加しようとしたところ、以下のエラー文が発生し、どのように手をつければ良いか分からず困っております。

Profileテーブルにfollowee/followerを追加することになった経緯
①フォロー・フォロー解除ができるようになったから、次ば、フォローをした場合、フォローした・された方のそれぞれの数が増えるviews.pyを追加しよう
②フォローしている人の数、フォローされている人の数の設定をそれぞれX,Yで置いたが、follower者とfollowing者のパラメータの設定をどうしたら区別することがわからなくなった。
③現時点のViews.pyでは、フォローした場合、フォローされた方の「フォロワー数」は増えるが、フォローした方の「フォロー中」の数は増えない(15行目GETGETリクエストのパラメータがおかしいから)

質問ばかりで申し訳ありませんが、助けてもらえると助かります。よろしくお願いいたします。

+α:そもそもProfileテーブルに追加しなくてもできる、ということはありますでしょうか。。。。。

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

AttributeError: 'str' object has no attribute '_meta'

該当のソースコード

models.py

python

1class Profile(models.Model): 2 class Meta: 3 verbose_name = 'ユーザー情報データ' 4 verbose_name_plural = 'ユーザー情報データ' 5 6 user = models.OneToOneField(User, verbose_name='ユーザー',null=True, blank=True, on_delete=models.CASCADE) 7 8 id = models.CharField('ユーザーID',max_length=20,primary_key=True) # 'user_name' 9 email = models.EmailField('メールアドレス', max_length=255, null=True) 10 full_name = models.CharField('氏名',max_length=50) # '佐藤太郎' 11 company = models.CharField('所属',max_length=50) # '〇〇株式会社' 12 position = models.CharField('役職',max_length=50) # '代表取締役' 13 image = models.ImageField(upload_to='media/images/user_image',null=True, blank=True,) # 'プロフィール画像' 14 introduce = models.TextField('自己紹介',blank=True,null=True,max_length=1000) # '自己紹介文' 15 URL = models.URLField() # 'TwitterURL' 16 followees = models.ManyToManyField( 17 'User', verbose_name='フォロー中のユーザー', through='Relationship', 18 related_name='followees', through_fields=('follower', 'following') 19 ) 20 followers = models.ManyToManyField( 21 'User', verbose_name='フォローされているユーザー', through='Relationship', 22 related_name='followers', through_fields=('following', 'follower') 23 ) 24 following_num = models.IntegerField('フォロー', default=0) 25 follower_num = models.IntegerField('フォロワー', default=0) 26 27 #管理画面で表示される文字列を定義する 28 def __str__(self): 29 #ログインログアウト機能の時に追加 30 user_str = '' 31 if self.user is not None: 32 user_str = '(' + self.user.username + ')' 33 34 return self.id 35 36 37class Relationship(models.Model): 38 class Meta: 39 verbose_name = 'フォロー情報データ' 40 verbose_name_plural = 'フォロー情報データ' 41 42 unique_together = ('follower', 'following') 43 44 follower = models.ForeignKey(User, related_name='follower', on_delete=models.CASCADE) 45 following = models.ForeignKey(User, related_name='following', on_delete=models.CASCADE) 46 date_created = models.DateTimeField(auto_now_add=True) 47 48 def __str__(self): 49 return f"{self.follower} follows {self.following}" 50 51

view.py

python

1@login_required 2def follow_view(request, user_id): 3 follower = User.objects.get(username=request.user.username) 4 following = User.objects.get(username=user_id) 5 6 if follower == following: 7 messages.warning(request, '自分自身はフォローできません') 8 print("自分自身はフォローできません") 9 else: 10 11 _, created = Relationship.objects.get_or_create(follower=follower, following=following) 12 1314 if (created): 1415 X = Profile.objects.get(id=user_id) 1516 print("aaa") 1617 Y = Profile.objects.get(id=user_id) 1718 print("bbb") 18 X.following_num += 1 #フォロー数を一人増やす 19 print("ccc") 20 Y.follower_num += 1 #フォロワー数を一人増やす 21 print("ddd") 22 X.save() #モデルインスタンスで保存してみた 23 print("eee") 24 Y.save() 25 print("fff") 26 27 28 messages.success(request, '{}をフォローしました'.format(following.username)) 29 30 print("フォローをしました") 31 else: 32 messages.warning(request, 'あなたはすでに{}をフォローしています'.format(following.username)) 33 print("すでにフォローしています") 34 35 return HttpResponseRedirect(reverse_lazy('stokee:profile_detail', kwargs={'user_id': following.username}))

補足情報(FW/ツールのバージョンなど)

Nac M1
python 3.8.4
shell zsh

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問