【问题标题】:RelatedObjectDoesNotExist at /profiles/user-follow-feed/ User has no userRelatedObjectDoesNotExist at /profiles/user-follow-feed/ 用户没有用户
【发布时间】:2020-10-15 11:33:01
【问题描述】:

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

views.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})

models.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.

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

【问题讨论】:

    标签: python django django-models django-rest-framework django-views


    【解决方案1】:

    followerUser 模型的ManyToManyField,因此列表推导中的xUser 对象:

    is_following_user_ids = [<b>x.id</b> for x in user.follower.all()]

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

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

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


    注意ForeignKey 确实存储 列中引用的对象,它存储它的记录的主键 在带有_id 后缀的列中引用ForeignKey 字段。所以 ForeignKeys 通常name 后缀结尾。你可能想要 考虑将 username 字段重命名为 author


    注意:您可以将视图限制为基于类的视图,以向经过身份验证的用户提供 LoginRequiredMixin mixin [Django-doc].

    【讨论】:

    • 现在它向我显示:**FieldError at /profiles/user-follow-feed/ 相关字段查找无效:​​is_following**
    • @FlashMaddy:但是related_name='is_following'?而username 是从PostUserUserProfileForeignKey
    • @FlashMaddy:如果你用username__id__in=过滤,这也有关系,实际上它的风险更大,因为如果你混合Users和UserProfiles的主键,它可以导致QuerySet 包含错误 数据。
    • username = models.ForeignKey(UserProfile, on_delete=models.CASCADE) 这是来自后期模型的字段
    • @FlashMaddy:那就是username__user__is_following__user。您原来的过滤不仅会导致 N+1 问题,还会显示无效数据。
    猜你喜欢
    • 2021-02-09
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    • 2020-07-17
    • 2016-07-18
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多