我正在尝试获取一个查询集,其中包含基于存储在模型“ FollowingProfiles”中的用户名的帖子。因此模型和相应的视图如下:-
from django.contrib.auth.models import User
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
def feed(request):
if request.user.is_authenticated:
userprofile=FollowingProfiles.objects.filter(Profile__user=request.user)
for p in userprofile:
postuser=post.objects.filter(Profile__user__username=p.ProfileName)
usrpost+=postuser
return render(request,'feed/feed.html',{'usrpost':usrpost})
else:
return redirect('signup')
它产生以下错误:-
function' object has no attribute 'objects'
C:\Users\G COMTECH SYSTEM\django-projects\saporaapp\sapora\views.py in feed, line 45
line 45 is
postuser=post.objects.filter(Profile__user__username=p.ProfileName)
答案 0 :(得分:1)
似乎您的post
模型与某些声明为函数的post
冲突。
我建议遵循PEP8命名类,函数,变量等,以避免此类情况。
在您的特定情况下,我将post
模型重命名为Post
,因为最好使用CamelCase样式命名类。
但是对于使用CamelCase的字段,最好使用下划线:
像这样:
class Post(models.Model):
profile = models.ForeignKey(Profile,on_delete=models.CASCADE)
picture = models.ImageField(upload_to='PostMedia',blank=True,null=True)
date_posted = models.DateTimeField(default=timezone.now)
content = models.TextField(blank=True,null=True)
如果要使其快速运行,请在post
文件中找到可以view.py
声明为函数的位置并将其重命名。如果是导入的,则可以将from mymodule import post
更改为import mymodule
,然后将函数调用为mymodule.post
也未声明usrpost
,这是没有for
循环的更好的解决方案:
userprofile_names=FollowingProfiles.objects.filter(Profile__user=request.user).values_list('ProfileName', flat=True)
usrpost=post.objects.filter(Profile__user__username__in=userprofile_names)
return render(request,'feed/feed.html',{'usrpost':usrpost})