Django获取与父对象相关的子对象
我使用的是Django 2.2,我的模型有两个类Django获取与父对象相关的子对象,django,django-models,django-select-related,django-related-manager,Django,Django Models,Django Select Related,Django Related Manager,我使用的是Django 2.2,我的模型有两个类Product和ProductRevision。当我检索产品或产品列表时,我总是获取相应的产品版本ProductRevision对象将递增,并且只应使用产品获取最后一个版本 class Product(models.Model): name = models.CharField(max_length=50, null=False, blank=False, verbose_name=_
Product
和ProductRevision
。当我检索产品
或产品
列表时,我总是获取相应的产品版本
ProductRevision
对象将递增,并且只应使用产品
获取最后一个版本
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\u item
,以获取给定产品的最新版本。虽然这是有效的,但效率非常低,因为当我在模板中使用它时,每当我显示相关ProductRevision
中的字段时,它都会命中数据库
我是根据Django()的一个旧版本找到这个答案的,我想知道是否有其他方法可以与当前版本的Django实现相同的结果?我特别热衷于在我的模型中实现这一点。我通过使用 上面的查询集只会为每个
产品
返回一个ProductRevision
,这实际上只需两次查询就可以为所有产品
提供最新的ProductRevision
for product in products:
for latest_revision in product.latest_revision:
print(product, latest_revision)
你在用postgres吗?是的,postgres 11.6是的,这是一条路!您应该在queryset:
queryset=ProductRevision.objects.order\u by('product\u id','-version')。distinct('product')
中用product\u id替换product。否则,您将得到SELECT distinct ON表达式必须匹配初始order by表达式错误(有关更多信息,请参阅)
for product in products:
for latest_revision in product.latest_revision:
print(product, latest_revision)