Django 获取与父对象相关的子对象

Django fetch related child with parent object

我正在使用 Django 2.2,我有一个包含两个 类 ProductProductRevision 的模型。当我检索 ProductProduct 列表时,我总是会获取相应的 ProductRevisionProductRevision 对象递增,只应使用 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 实现相同的结果?我对在我的模型中实现这一目标特别感兴趣。

我已经通过使用 custom prefetch related queryset

实现了类似的效果
products = Product.objects.prefetch_related(Prefetch(
    'productrevision_set',
    queryset=ProductRevision.objects.order_by('product', '-version').distinct('product'),
    to_attr='latest_revision'
))

上面的查询集只会 return 每个 Product 一个 ProductRevision 这实际上只在 2 个查询中为所有 Products 提供了最新的 ProductRevision

for product in products:
    for latest_revision in product.latest_revision:
        print(product, latest_revision)