首页 > 解决方案 > RelatedObjectDoesNotExist at /profiles/user-follow-feed/ 用户没有用户

问题描述

好吧,我只是想显示以下用户的反馈,但出现错误:RelatedObjectDoesNotExist at /profiles/user-follow-feed/ 用户没有用户。我不明白我该如何解决它。需要帮助来解决它。提前谢谢了。

视图.py

class FolloweHomeView(View):
   
    def get(self, request, *args, **kwargs):
    

        user = request.user.userprofile
        is_following_user_ids = [x.user.id for x in user.follower.all()]
        qs = Post.objects.filter(username__id__in=is_following_user_ids).order_by("-create_date")[:3]
        return render(request, "profiles/follower_home_feed.html", {'object_list': qs})

模型.py

class ProfileManager(models.Manager):
    def toggle_follow(self, request_user, username_to_toggle):
        profile_ = UserProfile.objects.get(user__username__iexact=username_to_toggle)
        user = request_user
        is_following = False
        if user in profile_.follower.all():
            profile_.follower.remove(user)
        else:
            profile_.follower.add(user)
            is_following = True
        return profile_, is_following

        
class UserProfile(models.Model):

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    follower = models.ManyToManyField(User, related_name ='is_following',blank=True,)
    avatar = models.ImageField(("Avatar"), upload_to='displays', default = '1.jpg',height_field=None, width_field=None, max_length=None,blank = True)
    create_date = models.DateField(auto_now_add=True,null=True)
   
    objects = ProfileManager()

    def __str__(self):
        return f'{self.user.username}'

追溯:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/profiles/user-follow-feed/

Django Version: 3.0.3
Python Version: 3.8.3
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'bootstrap3',
 'accounts',
 'posts',
 'profiles']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback (most recent call last):
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\core\handlers\base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\core\handlers\base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\views\generic\base.py", line 71, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\views\generic\base.py", line 97, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\AHMED\grapPub\grabpublic\profiles\views.py", line 99, in get
    is_following_user_ids = [x.user.id for x in user.follower.all()]
  File "C:\Users\AHMED\grapPub\grabpublic\profiles\views.py", line 99, in <listcomp>
    is_following_user_ids = [x.user.id for x in user.follower.all()]
  File "C:\Users\AHMED\anaconda3\lib\site-packages\django\db\models\fields\related_descriptors.py", line 420, in __get__
    raise self.RelatedObjectDoesNotExist(

Exception Type: RelatedObjectDoesNotExist at /profiles/user-follow-feed/
Exception Value: User has no user.

如果需要比告诉我更多的细节,我会用这些信息更新我的问题

标签: pythondjangodjango-modelsdjango-rest-frameworkdjango-views

解决方案


follower是模型的一个ManyToManyFieldUser所以x列表推导中的 是一个User对象:

is_following_user_ids = [x.id for x in user.follower.all()]

但是,您不需要执行这种逻辑,您可以直接过滤:

qs = Post.objects.filter(
    username__user__is_following__user=request.user
).order_by('-create_date')[:3]

这将Post在单个查询中查询对象。


注意:AForeignKey不会引用对象的字符串表示形式(或名称)存储在列中,它会将其引用的记录的主键存储在带有 字段_id后缀的列ForeignKey中。因此 ForeignKeys 通常不后缀结尾name。您可能需要考虑将username字段重命名为author.


注意:您可以使用LoginRequiredMixinmixin [Django-doc]将视图限制为对经过身份验证的用户的基于类的视图 。


推荐阅读