Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django获取与父对象相关的子对象_Django_Django Models_Django Select Related_Django Related Manager - Fatal编程技术网

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

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=_

我使用的是Django 2.2,我的模型有两个类
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)