Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.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 Queryset_Django Database - Fatal编程技术网

Django 查询集的缓存和重新评估

Django 查询集的缓存和重新评估,django,django-queryset,django-database,Django,Django Queryset,Django Database,我将发布一些不完整的代码来简化示例。我正在运行一个递归函数来计算层次结构上的一些度量 类别(models.Model): 我希望有足够的代码来了解发生了什么。这里我要介绍的是一个递归函数,它每次只运行这些查询一次,然后将结果向下传递。这似乎不是现在发生的事情,它正在扼杀性能。如果是PHP/MySQL(尽管在使用Django之后我不喜欢它们!),我可以只运行一次查询并将它们传递下去 根据我对Django的queryset的理解,它们不会在我的if queryset==None然后queryset=

我将发布一些不完整的代码来简化示例。我正在运行一个递归函数来计算层次结构上的一些度量

类别(models.Model):

我希望有足够的代码来了解发生了什么。这里我要介绍的是一个递归函数,它每次只运行这些查询一次,然后将结果向下传递。这似乎不是现在发生的事情,它正在扼杀性能。如果是PHP/MySQL(尽管在使用Django之后我不喜欢它们!),我可以只运行一次查询并将它们传递下去

根据我对Django的queryset的理解,它们不会在我的if queryset==None然后queryset=stuff部分中进行评估。我怎么能强迫你这么做?当我执行诸如
metric\u queryset.filter(category=self)
之类的操作时,是否会重新评估它


我不在乎数据是否新鲜。我只想为每个指标和评级从数据库中读取一次,然后在以后对它们进行过滤,而不会再次访问数据库。这是一个令人沮丧的问题,感觉它应该有一个非常简单的答案。酸洗看起来可以工作,但在Django文档中没有很好的解释。

我认为这里的问题是,直到递归调用之后,您才对queryset进行评估。如果使用
list()
强制对queryset求值,那么它应该只对数据库执行一次。注意,您必须将cat行中的
metrics\u更改为python级别的过滤器,而不是使用queryset过滤器

parent = models.ForeignKey('self', null=True, blank=True, related_name='children', default=1)

def compute_metrics(self, shop_object, metric_queryset=None, rating_queryset=None)
    if(metric_queryset is None):
        metric_queryset = list([Metric.objects.all())
    if(rating_queryset is None):
        rating_queryset = list(Rating.objects.filter(shop_object=shop_object))

    for child in self.children.all():
        # do stuff
        child_score = child.compute_metrics(shop_object, metric_queryset, rating_queryset)

    # metrics_in_cat = metric_queryset.filter(category=self)
    metrics_in_cat = [m for m in metric_queryset if m.category==self]
    for metric in metrics_in_cat
        # do stuff
parent = models.ForeignKey('self', null=True, blank=True, related_name='children', default=1)

def compute_metrics(self, shop_object, metric_queryset=None, rating_queryset=None)
    if(metric_queryset is None):
        metric_queryset = list([Metric.objects.all())
    if(rating_queryset is None):
        rating_queryset = list(Rating.objects.filter(shop_object=shop_object))

    for child in self.children.all():
        # do stuff
        child_score = child.compute_metrics(shop_object, metric_queryset, rating_queryset)

    # metrics_in_cat = metric_queryset.filter(category=self)
    metrics_in_cat = [m for m in metric_queryset if m.category==self]
    for metric in metrics_in_cat
        # do stuff