我正在尝试通过外键使用一对多关系生成查询集。我正在尝试从当前登录的用户获取配置文件实例,然后获取配置文件,之后,我将提取帖子以及评论。关联的模型是:
#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值必须使用切片限制为一个结果。
您在此处提供的代码有很多问题。
第一:
if request.user.is_authenticated:
profile=Profile.objects.filter(user=request.user) <--- Here
配置文件与用户具有OneToOne关系。因此,应该可以通过进行访问request.user.profile
。
同样在后面的部分中,您将queryset与Django Object混合在一起并尝试使它们无效,这是没有意义的。如果您想查看评论和帖子,则可以像下面这样简单地将其作为模板:
{% if user.is_authenitcated %}
{% for post in user.profile.post_set.all %}
{{ post }}
{% for comment in post.comment_set.all %}
{{ comment }}
{% endfor %}
{% endfor %}
{% endif %}
此代码可在您项目的任何模板中使用。有关参考,请参阅相关对象的文档。
您可以使用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 %}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句