前提・実現したいこと
フォロー機能を実装したいです。
初めに、フォロー機能を実装させたいが、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
あなたの回答
tips
プレビュー