使用关系源对象获取对象

时间:2014-12-18 14:11:34

标签: django

模特:

class Offer(models.Model):
    desc = models.TextField()

class Bid(models.Model):
    offer = models.ForeignKey(Offer)

因此,一个要约可能会有很多出价。

有没有办法获取所有优惠,其出价却不对每个优惠进行查询? 有一个包含商品列表的表格,如果至少有一个出价,我需要在每一行添加一个“B”标志。

我尝试使用prefetch_related()。这很好。我为每个商品实例附加了一个“出价”属性(作为列表),但它导致了num_offers查询。

offers = Offer.objects.prefetch_related(
models.Prefetch('bid_set', to_attr='bids', queryset=Bid.objects.select_related()))

1 个答案:

答案 0 :(得分:1)

由于您要从1到多的优惠模型查询,因此唯一可行的方法是执行2次查询(1次为要约,1次为所有相关出价)

offers = Offer.objects.prefetch_related('bid_set').annotate(number_of_bids=models.Count('bid_set')).all()

另一方面,您可以从另一方创建一个查询,从Bid到Offer,这将创建一个带JOIN的单一查询:

bids = Bid.objects.select_related('offer').all()
offers = [o.offer for o in bids]

您更喜欢哪一个取决于您想要的内容以及数据的结构方式或数据库中包含的条目数。

Annotate将生成一个虚拟的number_of_bids字段,其中包含每个商品的出价数量。