我是Django和编码的新手。我有这个项目,我试图代码,基本上是一个拍卖网站。
不过,我在构建模型时遇到了一些困难。
下面是2款全系车型
class Listing(models.Model):
title = models.CharField(max_length=64)
image = models.URLField(null=True, blank=True)
description = models.CharField(max_length=64)
starting_price = models.DecimalField(max_digits=7, decimal_places=2)
current_price = #highest bid price
bids_count = #count of bids
lister = models.ForeignKey(User, on_delete=models.CASCADE, related_name="listings")
def __str__(self):
return f"Title: {self.title} ({self.id}), Lister: {self.lister.username}"
class Bid(models.Model):
listing = models.ForeignKey(Listing, on_delete=models.CASCADE, related_name="bids")
bidder = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="bids")
amount = models.DecimalField(max_digits=7, decimal_places=2)
time = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"Bid by {self.bidder.username} on {self.listing.title} ({self.listing.id}) for an amount of {self.amount}"
我试图让目前的价格等于最高出价的上市
current_price = Listing.bid.objects.all().aggregate(Max("amount"))
并统计出价的数量
bids_count = Listing.bid.count()
我知道我们不能像我所做的那样将查询集放在模型字段中,但我这样做是为了演示我的问题。
当然,有一些方法可以解决这个问题,但我就是想不出来。
1条答案
按热度按时间5anewei61#
正如您所说,您不能将这些字段“按原样”放在模型中。解决这个问题最简单/最快的方法是使用一个属性:
现在,请注意,当您使用单个示例时,这将很好。如果循环遍历
Listing
示例的列表并显示这些属性,这将不会有很好的性能,因为每次访问这些属性时都会触发一个新的db查询(因此这些值是以惰性方式获取的)。我认为最好的解决方法是使用自定义管理器,如下所示:
对于刚接触Django/coding的人(尤其是使用子查询的人)来说,前面的方法更高级。您可以在文档中阅读更多关于这一切的信息:
请注意,我没有尝试代码