字段“id”需要一个数字,但得到<Listing:Ps4 Pro>

2024-05-05 11:54:05 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我第一次用模型创建Django网站,在我第一次尝试将数据插入表时,我遇到了这个错误

我的模型如下:

class User(AbstractUser):
    pass
    #https://docs.djangoproject.com/en/3.1/topics/auth/default/

class Listing(models.Model):
    listingID = models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="listID")
    created_by = models.ForeignKey(User, on_delete=models.SET_NULL, related_name="myListing", null=True)
    watchers = models.ManyToManyField(User, blank=True, related_name="watchlist")

    title = models.CharField(max_length=30)
    description = models.TextField()
    creation_date = models.DateField(auto_now=True)
    img_url = models.URLField()
    active = models.BooleanField(default=True)

    def __str__(self):
        return f"{self.title}"

class Bid(models.Model):
    listing = models.ForeignKey(Listing, on_delete=models.SET_NULL, related_name="bidsMadeOnMe", null=True, blank=True)
    user = models.ForeignKey(User, on_delete=models.SET_NULL, related_name="myBids", null=True)

    price = models.FloatField()
    creation_date = models.DateField(auto_now=True, null=True)

    def __str__(self):
        return f"Bid={self.price}"

处理表单提交的视图如下所示:

@login_required
def create_listing(request):
    if request.method == "POST":
        user = User.objects.get(username=request.user.username)
        l = Listing(created_by=user, 
                    title=request.POST["title"], 
                    description=request.POST["desc"], 
                    # https://stackoverflow.com/questions/12176585/handling-dates-over-request-get
                    creation_date=models.DateTimeField(auto_now_add=True), 
                    img_url=request.POST["image_url"]
                    )
        l.save()

        b = Bid(l, 
                user, 
                request.POST["initial_bid"], 
                models.DateTimeField(auto_now_add=True)
                )
        b.save()

    return render(request, "auctions/index.html")

我知道问题在于我添加数据的方式,但我无法修复它。谁能给我点光吗


1条回答
网友
1楼 · 发布于 2024-05-05 11:54:05

你的问题(实际上有几个)是:

b = Bid(l, user, request.POST["initial_bid"], models.DateTimeField(auto_now_add=True))

您正在通过位置参数而不是关键字参数构造模型实例。这是可以做到的,但是添加到投标模型中的不可见“id”列是第一个参数

在Django中,我们从不这样构造模型,但总是使用关键字参数,因此我们不依赖于字段顺序:

b = Bid(listing=l, user=user, ...))

一旦解决了这个问题,下一个问题就是日期字段

不要将字段指定给模型实例。字段是类声明,它们不属于实例。字段描述类(=模型)上的数据类型。在实例上,指定该数据

在这种情况下,您在模型和实例上对字段的定义是错误的,您甚至不应该分配它-它将自动填充

总的来说,感觉您还没有经历过Django's tutorial或者没有完全理解这些概念。我建议你去看看

相关问题 更多 >