Django - 无法使用视图功能将新条目保存到数据库

时间:2018-06-10 08:38:24

标签: python django

这是我正在使用的视图功能

views.py

def favorite_item (request, pk):
    favitem = get_object_or_404(Item, pk=pk)
    userfav = Favorite.objects.filter(user=request.user)
    for items in userfav:
        if items.item == favitem:
            items.delete()
        else:
            new_entry = Favorite(item=favitem, user=request.user)
            new_entry.save()

    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))

删除已存在的部分行完美运行:

   if items.item == favitem:
        items.delete()

但我认为问题在于我尝试添加新行,只返回任何内容,甚至没有提出错误!

else:
    new_entry = Favorite(item=favitem, user=request.user)
    new_entry.save()

1 个答案:

答案 0 :(得分:1)

逻辑可能已经关闭。 favitem可能是用户想要收藏/不喜欢的项目。此外,userfav是该用户最喜欢的项目列表。

{h1> if - else循环中的for子句

但是你开始迭代在那个列表上。如果Favorite是收藏的项目,则将其删除(这可能是正确的)。但是如果用户的收藏夹列表中的项目不是该用户的最爱,那么您添加另一个Favorite对象,所以现在有两个 Favorites将此元素与用户链接。

修复逻辑

您可能只想执行else部分,以防if部分从未执行过(即无循环)。我们可以使用for - else构造:

来实现
for items in userfav:
    if items.item == favitem:
        items.delete()
        break
else:
    new_entry = Favorite(item=favitem, user=request.user)

请注意,此处elsefor循环. And the中断is crucial, since this will make sure the其他部分处于同一级别已解雇

优化程序

但是我们太难了。我们可以简单地让Django执行过滤,并删除收藏夹。我们也可filter(..) item上的Favorite查询集,并删除这些条目。如果没有删除条目,我们可以添加这样的def favorite_item (request, pk): favitem = get_object_or_404(Item, pk=pk) num, __ = Favorite.objects.filter(user=request.user, item=favitem).delete() if not num: new_entry = Favorite.objects.create(item=favitem, user=request.user) return HttpResponseRedirect(request.META.get('HTTP_REFERER'))条目:

num

因此,此处Favorite将包含已删除的Favorite条目数。如果不是零,我们删除了一个或多个用户为request.user的{​​{1}},itemfavitem

如果num不为零,我们会.create(..)新的Favorite

约束Favorite模型

您还可以更好地约束您的Favorite模型。现在,看起来用户可以使相同 Item Favorite 多次次。您最好使用unique_together来防止:

class Favorite(models.Model):

    item = ForeignKey(Item, on_delete=models.CASCADE)
    user = ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        unique_together = (('item', 'user'), )

当然,我在这里对Favorite模型的外观做了一些假设。然而,重要的部分是unique_together

如果我们添加了这样的约束,我们知道对于.filter(user=..., item=...),总会有最多一个这样的元素。所以在这种情况下,逻辑更简单:

def favorite_item (request, pk):
    favitem = get_object_or_404(Item, pk=pk)
    try:
        Favorite.objects.get(user=request.user, item=favitem).delete()
    except Favorite.DoesNotExist:
        new_entry = Favorite.objects.create(item=favitem, user=request.user)

    return HttpResponseRedirect(request.META.get('HTTP_REFERER'))