Django 获取与父对象相关的子对象
Django fetch related child with parent object
我正在使用 Django 2.2,我有一个包含两个 类 Product
和 ProductRevision
的模型。当我检索 Product
或 Product
列表时,我总是会获取相应的 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 实现相同的结果?我对在我的模型中实现这一目标特别感兴趣。
我已经通过使用 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)
我正在使用 Django 2.2,我有一个包含两个 类 Product
和 ProductRevision
的模型。当我检索 Product
或 Product
列表时,我总是会获取相应的 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 实现相同的结果?我对在我的模型中实现这一目标特别感兴趣。
我已经通过使用 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)