1

我正在使用 Django 2.2,并且我有一个包含两个类ProductProductRevision. 当我检索一个ProductProducts 列表时,我总是获取相应的ProductRevision. ProductRevision对象是递增的,只有最后一个版本应该用Product.

class Product(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False,
                            verbose_name=_("name"))
    product_code = models.CharField(max_length=10, null=False, blank=False,
                                    verbose_name=_("product code"))
    slug = models.SlugField(null=False, unique=True)

    @property
    def current_item(self):
        return ProductRevision.objects.filter(product=self, active=True).order_by('-version').first()


class ProductRevision(models.Model):
    product = models.ForeignKey(Product, null=True, on_delete=models.PROTECT)
    version = models.IntegerField(default=0,
                                  verbose_name=_("version"))
    active = models.BooleanField(default=False, null=False, blank=True,
                                 verbose_name=_("is active"))
    qty_close = models.IntegerField(default=0,
                                    verbose_name=_("qty of accounts to be closed"))
    price_eur = models.DecimalField(max_digits=6, decimal_places=2, default=0,
                                    verbose_name=_("price in EUR"))

我试图添加一个属性current_item来获取给定产品的最新版本。虽然这是有效的,但效率非常低,因为当我在模板中使用它时,每次显示相关的字段时它都会访问数据库ProductRevision

我根据旧版本的 Django ( Fetch latest related objects in django ) 找到了这个答案,我想知道当前版本的 Django 是否没有其他方法可以达到相同的结果?我对在我的模型中实现这一点特别感兴趣。

4

1 回答 1

2

我已经设法通过使用自定义预取相关查询集来实现与此类似的事情

products = Product.objects.prefetch_related(Prefetch(
    'productrevision_set',
    queryset=ProductRevision.objects.order_by('product', '-version').distinct('product'),
    to_attr='latest_revision'
))

上面的查询集只会返回一个,这实际上只在 2ProductRevision个查询Product中为我们提供了最新ProductRevisionProducts

for product in products:
    for latest_revision in product.latest_revision:
        print(product, latest_revision)
于 2019-12-22T22:58:22.433 回答