【问题标题】:accessing foreign keys in djnago views, id attribute of model class在 django 视图中访问外键,模型类的 id 属性
【发布时间】:2023-03-23 09:32:01
【问题描述】:

这是我的三个模型:

    class User(AbstractUser):
        pass

    class Category(models.Model):
        Name = models.CharField(max_length=20)

    class Listing(models.Model):
        Title = models.CharField(max_length=20)
        Description = models.TextField()
        StartingBid = models.IntegerField()
        Category = models.ManyToManyField(Category, verbose_name="Categories")
        Image = models.URLField()
        CurrentBid = models.IntegerField()
        Author = models.ForeignKey(User, on_delete=models.CASCADE)
        Close = models.BooleanField()

这是将我带到所需视图的网址:

    path("<str:user>/<str:name>", views.name, name="name"),

最后是名称视图:

def name(request, user, name):
    try:
        l = Listing.objects.get(Title=name)
    except Listing.DoesNotExist:
        l = None
    try:
        **bid = Bid.objects.get(Bidder=user, Item=name)**
    except Bid.DoesNotExist:
        bid = None
    if l.CurrentBid == bid.Value and l.Close:
        won = True
    else:
        won = False
    if l.Author == user:
        owner = True
    else:
        owner = False
    watchlist = Watchlist.objects.all()
    if name in watchlist:
        added = True
    else:
        added = False
    return render(request, "auctions/name.html", {
        "item": l,
        "added": added,
        "form_bid": BidForm(),
        "m": "",
        "owner": owner,
        "comments": Comments.objects.filter(Item=name),
        "won": won
    })

这就是问题所在:

    bid = Bid.objects.get(Bidder=user, Item=name)

错误信息:

字段 'id' 需要一个数字,但得到了 'admin'。(admin 是用户名)

我想出了问题所在,但我不知道该怎么办。 bid 类的bidder 属性是User 类的外键

有人能告诉我怎么做吗?

【问题讨论】:

    标签: django django-models foreign-keys


    【解决方案1】:
    path("<str:user>/<str:name>", views.name, name="name")
    

    错误告诉你“嘿,Bidder 应该是一个 int(它是一个外键),而你给了我一个字符串”。我相信您可以给它id 或ForeignKey 引用的模型实例。你在这里有用户的用户名,所以你可以这样做

    bidder = User.objects.get(username=user)
    

    请注意,Item 参数也会有同样的问题,因为我认为它是引用 Listing 实例的 ForeignKey?然后你需要在这里传递你的l 变量。最后:

    bid = Bid.objects.get(Bidder=bidder, Item=l)  # `bidder` and `l` are instances of `User` and `Listing`
    

    在此处设置使用主键的路径可能会更好,并使用.get(pk=...) 获取每个模型的实例:

    path("<int:user_id>/<int:listing_id>", views.name, name="name")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2016-05-05
      • 1970-01-01
      • 2012-01-28
      • 2020-09-29
      • 2013-12-20
      • 1970-01-01
      相关资源
      最近更新 更多