为了账号安全,请及时绑定邮箱和手机立即绑定

get_object_or_404(个人资料,用户= request.user)错误

get_object_or_404(个人资料,用户= request.user)错误

料青山看我应如是 2021-04-06 17:14:40
我正在尝试为我的网站创建一个购物车,但是在我的函数“ add_to_cart”中,当我尝试在函数开始时请求用户配置文件模型时,它告诉我“用户”对象没有属性“配置文件”add_to_cart是Checkout views.py中#get用户个人资料下的第一种方法错误 AttributeError at /checkout/add-to-cart/2/'User' object has no attribute 'profile'Request Method: GETRequest URL:    http://127.0.0.1:8000/checkout/add-to-cart/2/Django Version: 1.11Exception Type: AttributeErrorException Value:    'User' object has no attribute 'profile'如果我在个人档案中删除用户的related_name,那么我会收到此错误:删除related_name时出错Request Method: GETRequest URL:    http://127.0.0.1:8000/checkout/add-to-cart/2/Django Version: 1.11Exception Type: AttributeErrorException Value:    'Product' object has no attribute 'all'
查看完整描述

1 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

您的个人资料模型通过user_profile相关名称与您的用户模型相关,因此查询它的正确方法是:


...

if product in request.user.user_profile.merchandise.all():

    ...

如果出于任何原因要重命名此关系,则:


class Profile(models.Model):

    user = models.OneToOneField(settings.AUTH_USER_MODEL, related_name='profile')

然后,您的merchandise关系是一对一的,因此它将返回一个对象,而不是一个集合,不需要全部:


...

if product in request.user.user_profile.merchandise:

    ...

您可以在此处进行的一项改进是,由于商品是另一个对象,因此该查找将再次访问数据库,以查看商品是否存在。为了节省您的数据库命中率,可以使用Profile自动字段merchandise_id来读取保存在Profile表中的信息:


...

if product in request.user.user_profile.merchandise_id:

    ...

每个关系(ForeignKey,ManyToMany和OneToOne)都会在转发模型中创建这些自动字段,因此可以轻松地查询相关对象是否存在而不必调用它。


我知道您很难理解Django ORM的所有概念,因此我建议您通读本文档页面,它涵盖了成功Django项目的所有不同关系和概念。


查看完整回答
反对 回复 2021-04-27
  • 1 回答
  • 0 关注
  • 448 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号