django - “函数”对象没有属性“对象”
问题描述
我正在尝试获取一个查询集,其中包含基于存储在模型“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
视图.py
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)
解决方案
似乎您的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})
推荐阅读
- html - Vuetify:所需标签上的星号
- css - 将自定义样式添加到 react-styleguidist 库
- django - 在 django oauth2_provide 中生成访问令牌和刷新令牌的方法或类是什么
- database - 表单提交中阿拉伯字符转换为一些特殊字符(例如:ﻋﺎ)
- angularjs - 使用 OAuth 的 Angularjs 安全性
- c# - 从具有六边形架构(端口和适配器)的多个数据源加载对象
- regex - 用破折号分隔的可变数量的字母数字字符简化正则表达式
- haskell - keter 上的 Yesod 应用程序具有对 DB 的只读访问权限
- amazon-web-services - 允许用户启用存储桶以进行静态网站托管的 s3 权限是什么?
- kubernetes - 如何让一个 Kubernetes 服务与其他 Kubernetes 服务通信?