AttributeError没有属性“删除”

时间:2020-06-04 09:28:02

标签: python django

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

型号:

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'))

3 个答案:

答案 0 :(得分:0)

如果找不到匹配的行,

.first()将返回None

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

请注意,first()是一种便捷方法,下面的代码示例与上面的示例等效:

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

[edit]您需要处理None-情况,从上面的解释中应该已经很清楚了。另外,我建议学习使用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()

答案 1 :(得分:0)

我像这样解决了它(我不知道这是否是最好的方法,但它确实起作用了),删除了.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'))

答案 2 :(得分:0)

最好传递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()

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