【发布时间】:2020-09-07 02:53:09
【问题描述】:
我正在为一个班级编写一个 Django 程序。我知道错误与外键分配有关,但我不明白我的逻辑缺陷在哪里。
以下是两个相关的模型:
class listing(models.Model):
title = models.CharField(max_length=100)
description = models.TextField()
url = models.URLField(default="", null=True, max_length=100)
category = models.CharField(default="", max_length=50)
user_name = models.CharField(max_length=100)
date = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
min_bid = models.DecimalField(max_digits=8, decimal_places=2)
class watchlist(models.Model):
item_id = models.IntegerField(null=False)
user_id = models.IntegerField(null=False)
#item_id = models.ForeignKey("auctions.listing", on_delete=models.CASCADE, related_name="item_watchlist")
#user_id = models.ForeignKey("auctions.User", on_delete=models.CASCADE, related_name="user_watchlist")
watchlist Class 中的最后两行已被注释掉,使代码能够正常工作。但是,我想了解如何按照我最初的意图进行这项工作。如下:(以下代码在对象创建部分失败,带有ValueError, cannot assign <value>: item_id must be an instance of listings.)
@login_required
def item_listing(request, id):
itemID = id
# GET call coming in from clicking a title link
if request.method == "GET":
item = listing.objects.filter(id=id)
# Check if the item is on the user's watchlist
if watchlist.objects.filter(item_id=id, user_id=request.user.id).exists():
watch = True
else:
watch = False
return render(request, "auctions/ItemPage.html", {
"item": item,
"name": item[0].title,
"url": item[0].url,
"description": item[0].description,
"user_name": item[0].user_name,
"price": item[0].min_bid,
"category": item[0].category,
"watch": watch
})
# POST call coming in from clicking the watchlist button
if request.method == "POST":
q = request.POST.get('wl')
# Remove from watchlist. Delete entry in database.
if q == "Remove from Watchlist":
watchlist.objects.filter(item_id=id, user_id=request.user.id).delete()
# Add to watchliset. Create entry.
else:
watchlist.objects.create (
item_id=id,
user_id=request.user.id
)
# Redirect back to thet page
pathname = "/" + str(itemID)
return redirect(pathname)
我的假设是在 watchlist 模型上创建外键会将选择限制为 listing PK。删除对象没问题,它工作正常。即使我可以查询列表并且确实存在 7 的 ID,但使用 7 的 Item_id 创建对象未能添加到监视列表:
listing.objects.all()
<QuerySet [<listing: Japanese Tea pot>, <listing: Kindle paperwhite>]>
>>> listing.objects.filter(id=7)
<QuerySet [<listing: Japanese Tea pot>]>
所以我认为我对 ForiegnKey 的理解和使用是有缺陷的。我该如何正确地做到这一点?
另外,如果我的格式关闭,我深表歉意,这是我第一次在这里发帖。
【问题讨论】: