python - Django 模型查询调整

标签 python django

我想减少 my_filter_function() 中模板过滤器调用的数量。因为它在模板内的两个 for 循环内使用。请参阅下面的我的代码设置。

class ModelA(models.model):
    models.ForeignKey(OtherModel1)

class ModelB(models.model):
    models.ForeignKey(OtherModel2)

class ModelC(models.Model):
    a = models.ForeignKey(ModelA)
    b = models.ForeignKey(ModelB)

def my_views(request):
       return render(request, 'my_template.html', {
        'a_list': ModelA.objects.all(),
        'b_list': ModelB.objects.all(),
    })

在我的模板中,我有

{% for a in a_list %}
   {% for b in b_list %}
             {% with b|my_filter_function:a as my_val %}
                       Val: {{my_val}}
             {% endwith %}
   {% endfor %}
{% endfor %}

上面的模板将调用 my_filter_function 过滤函数,我需要找到另一种方法来减少 my_filter_function 函数调用的次数,因为过滤函数现在每个模板访问数据库数千次。

@register.filter
def my_filter_function:(b, a):
        z = ModelC.objects.filter(a=a, b=b)
        if z.count() > 0:
            return "OK"
        else:
            return "Not OK"

最佳答案

这是一个更快的替代方案。

一次性获取CAB的所有id:

z = ModelC.objects.values_list('a_id', 'b_id')

a_related, b_related = zip(*z) # split into a and b ids

将这些传递到您的上下文:

def my_views(request):
       return render(request, 'my_template.html', {
        'a_list': ModelA.objects.all(),
        'b_list': ModelB.objects.all(),
        'a_related': a_related,
        'b_related': b_related,
    })

然后在模板中使用if...in。现在可以放弃自定义模板过滤器:

{% for a in a_list %}
   {% for b in b_list %}
             {% if a.id in a_related and b.id in b_related %}
                 "OK"
             {% else %}
                 "Not ok"
             {% endif %}
   {% endfor %}
{% endfor %}

这会将过滤器中的所有多个查询替换为一个。

关于python - Django 模型查询调整,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38315188/

相关文章:

python - 如何创建对象属性列表并从列表中更改它?

python - Django - 覆盖管理中的默认管理器 - InheritanceManager

python - django forms save() 有一个意想不到的关键字参数?

python - DataFrame 相关性产生 NaN,尽管它的值都是整数

python - 如何将变量传递给 unicode/raw (ur"") 转换函数

python - 如何覆盖 Django 模型创建而不影响更新?

python - 在列中创建相同的值,直到下一个日期

python - Django REST Framework 和 MongoEngine 的 AttributeError

python - Django 中的模型历史

python - 是否可以在 Django 模板语言中定位 html 元素的值?