AttributeError没有属性“删除”

2024-06-16 14:37:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我在一个网站上工作,用户可以发送朋友请求,接受请求,取消请求。我有一个错误AttributeError对象没有属性“delete”。当我取消好友请求时会发生这种情况。这是我尝试的代码:

型号:

class FriendRequest(models.Model):
    to_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='to_user')
    from_user = models.ForeignKey(settings.AUTH_USER_MODEL,on_delete=models.CASCADE, related_name='from_user')
    date = models.DateTimeField(auto_now_add=True, null= True) 

class Meta:
    verbose_name = 'Friend request'
    verbose_name_plural = 'Friend requests'
    ordering = ['-date']

def __str__(self):
    return "from {}, to {}".format(self.from_user.username, self.to_user.username)

Views.py:

@login_required
def cancel_friend_request_view(request, id):
    user = get_object_or_404(User, id=id)
    frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user).first()
    frequest.delete()
    print(frequest)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

Tags: tonamefromselfauthidsettingsmodels
3条回答

最好通过FriendRequest的ID,完全跳过这段代码:

user = get_object_or_404(User, id=id)
frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user).first()

你可以这样做:

friend_request = get_object_or_404(FriendRequest, id=id)
friend_request.delete()

还考虑不完全删除数据库中的数据,而是使用删除的标志来保持整个软件的行为历史。

我这样解决了它(我不知道这是否是最好的方法,但它起了作用),删除。first():

@login_required
def cancel_friend_request_view(request, id):
    user = get_object_or_404(User, id=id)
    frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user)
    frequest.delete()
    print(frequest)
return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

如果找不到匹配的行,.first()将返回None

https://docs.djangoproject.com/en/3.0/ref/models/querysets/#first

Note that first() is a convenience method, the following code sample is equivalent to the above example:

try:
    p = Article.objects.order_by('title', 'pub_date')[0]
except IndexError:
    p = None

[编辑]您需要处理None-case,上面的解释应该已经清楚了。此外,我建议学习使用python调试器检查变量类型,而不是依赖调试打印

@login_required
def cancel_friend_request_view(request, id):
    user = get_object_or_404(User, id=id)
    frequest = FriendRequest.objects.filter(from_user=request.user, to_user=user)
    if frequest is None:
       raise Http404()
    frequest.delete()

相关问题 更多 >