gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 09:21:09 26 4
gpt4 key购买 nike

这是我正在使用的 View 功能

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

最佳答案

逻辑可能不正确。 favitem 可能是用户想要收藏/取消收藏的项目。此外,userfav 是该用户最喜欢的项目列表。

for 循环中的 if- else 子句

但随后您开始迭代该列表。如果 Favorite 是您要收藏的项目,则将其删除(这可能是正确的)。但是,如果用户收藏夹列表中的项目不是该用户的收藏夹,则您可以添加另一个 Favorite 对象,所以现在两个收藏夹将此类元素与用户链接起来。

修复逻辑

您可能只想在 if 部分从未执行过(即在无循环中)的情况下执行 else 部分。我们可以使用 for-else 结构来做到这一点:

for items in userfav:
if items.item == favitem:
items.delete()
<b>break</b>
<b>else:</b>
new_entry = Favorite(item=favitem, user=request.user)

因此请注意,这里的 elsefor 循环处于同一级别。 break至关重要,因为这将确保else`部分不会被触发。

优化流程

但我们让它变得太难了。我们可以简单地让 Django 执行过滤,并删除收藏夹。我们也可以filter(..) item 上的查询集,并删除这些条目。如果没有删除任何条目,我们可以添加这样的Favorite条目:

def favorite_item (request, pk):
favitem = get_object_or_404(Item, pk=pk)
<b>num, __</b> = Favorite.objects.filter(user=request.user<b>, item=favitem</b>)<b>.delete()</b>
<b>if not num:</b>
new_entry = Favorite<b>.objects.create</b>(item=favitem, user=request.user)

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

所以这里num将包含删除的Favorite条目的数量。如果不为零,我们会删除一个或多个用户为 request.userFavorite,而 item 是我们的 >收藏夹

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

限制最喜欢的模型

您还可以更好地限制您的Favorite模型。现在,用户似乎可以多次将相同Item设为最爱多次。您最好使用 unique_together 来防止这种情况:

class Favorite(models.Model):

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

<b>class Meta:
unique_together = (('item', 'user'), )</b>

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

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

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

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

关于python - Django - 无法使用 View 功能将新条目保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50781953/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com