【问题标题】:The QuerySet value for an exact lookup must be limited to one result using slicing精确查找的 QuerySet 值必须使用切片限制为一个结果
【发布时间】:2019-05-26 00:06:31
【问题描述】:

我正在尝试通过外键使用一对多关系生成查询集。我正在尝试从当前登录的用户获取配置文件实例,然后获取配置文件,之后,我将提取帖子以及评论。关联模型是:-

#models.py
from django.contrib.auth.models import User

#this is how profile of a sample user, say MAX looks like
class Profile(models.Model):
    Follwers=models.IntegerField(default='0')
        user=models.OneToOneField(User,on_delete=models.CASCADE,primary_key=True)
    bio=models.TextField(max_length=120,blank=True)
    location=models.CharField(max_length=30,blank=True)
    birth_date=models.DateField(null=True,blank=True)
    verified=models.BooleanField(default=False)
        ProfilePic=models.ImageField(upload_to='UserAvatar',blank=True,null=True)

def __str__(self):
    return self.user.username

@receiver(post_save,sender=User)
def update_user_profile(sender,instance,created,**kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save() 

class FollowingProfiles(models.Model):
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
    ProfileName=models.CharField(max_length=120,blank=True,null=True)

    def __str__(self):
        return self.ProfileName

class post(models.Model):
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
    Picture=models.ImageField(upload_to='PostMedia',blank=True,null=True)
    DatePosted=models.DateTimeField(default=timezone.now)
    Content=models.TextField(blank=True,null=True)

    def __str__(self):
        return self.Profile.user.username

class comment(models.Model):
    post=models.ForeignKey(post,on_delete=models.CASCADE)
    Profile=models.ForeignKey(Profile,on_delete=models.CASCADE)
 Content=models.CharField(max_length=120,null=False,blank=False,default='it is sapora')

    def __str__(self):
        return self.Profile.user.username

#views.py
def feed(request):
    if request.user.is_authenticated:
        profile=Profile.objects.filter(user=request.user)
        userfollowing=FollowingProfiles.objects.filter(Profile=profile)
        for following in userfollowing:
            username=following.ProfileName
            useraccount=User.objects.filter(username=username)
            mprofile=Profile.objects.filter(user=useraccount)
            Post=post.objects.filter(Profile=mprofile)
            comment=comment.objects.filter(post=Post)
            final_post_queryset=final_post_queryset+Post
            final_comment_queryset=final_comment_queryset+comment
        return render(request,'feed/feed.html',{'final_comment_queryset':final_comment_queryset,'final_post_queryset':final_post_queryset})
    else:
        return redirect('signup')

它会产生以下错误:- 精确查找的 QuerySet 值必须使用切片限制为一个结果。

【问题讨论】:

    标签: django django-models django-forms django-views


    【解决方案1】:
    profile=Profile.objects.filter(user=request.user)[0]
    userfollowing=FollowingProfiles.objects.filter(Profile=profile)
    

    profile 必须是 Profile-object,而不是 Profile-queryset。

    【讨论】:

      【解决方案2】:

      您在此处提供的代码存在许多问题。

      第一:

      if request.user.is_authenticated:
          profile=Profile.objects.filter(user=request.user)  <--- Here
      

      Profile 与 User 具有 OneToOne 关系。所以它应该可以通过request.user.profile访问。

      此外,在后面的部分中,您将查询集与 Django 对象混合并尝试与它们联系,这是没有意义的。如果您想查看 cmets 和帖子,您可以像这样简单地做它的模板:

      {% if user.is_authenitcated %}
          {% for post in user.profile.post_set.all %}
                {{ post }}
                {% for comment in post.comment_set.all %}
                    {{ comment }}
                {% endfor %}
          {% endfor %}
      {% endif %}
      

      并且此代码适用于您项目的任何模板。相关对象请参见documentation

      更新

      您可以使用ManyToMany 关系在配置文件中设置following

      class Profile(models.Models):
          # rest of the code
          following = models.ManyToManyField("self", blank=True)
      

      在模板中,显示他们的帖子如下:

      {% if user.is_authenitcated %}
          {% for profile in user.profile.following.all %}
                {% for post in profile.post_set.all %}
                    {{ post }}
                {% endfor %}
          {% endfor %}
      {% endif %}
      

      【讨论】:

      • 此代码仅显示用户发布的帖子,但我也想显示他或她关注的用户发布的帖子
      • 在这种情况下,您需要更改您的FollowingProfiles。因为它没有引用它所关注的其他个人资料(它只引用了用户的个人资料)
      • 你能提出一些改变吗?
      • @Gagan 如果这个答案对你有帮助,please consider accepting it。谢谢。
      猜你喜欢
      • 2019-10-02
      • 2020-11-13
      • 1970-01-01
      • 2021-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多