在Django视图中检索和使用ContentTypes的最佳实践

时间:2013-08-06 10:51:57

标签: django performance contenttypes

一个 views.py中不同视图中检索相同Django ContentTypes的更有效方法是什么?

a)分别检索每个视图中的类型,如下所示:

from django.contrib.contenttypes.models import ContentType

def my_view1(request):
    t1 = ContentType.objects.get_for_model(my_model1)
    t2 = ContentType.objects.get_for_model(my_model2)
    # ... work with t1 and t2


def my_view2(request):
    t1 = ContentType.objects.get_for_model(my_model1)
    t2 = ContentType.objects.get_for_model(my_model2)
    # ... work with t1 and t2

或b)在views.py的开头将一次检索为常量,如下所示:

from django.contrib.contenttypes.models import ContentType

T1 = ContentType.objects.get_for_model(my_model1)
T2 = ContentType.objects.get_for_model(my_model2)

def my_view1(request):
    # ... work with T1 and T2


def my_view2(request):
    # ... work with T1 and T2

ContentTypes数据库表非常小,但是,Django仍然需要为每个查询建立连接。所以我的猜测是,b)因此更快......?!

1 个答案:

答案 0 :(得分:5)

从评论行到get_for_modelsource code):

  

返回给定模型的ContentType对象,必要时创建ContentType。缓存查找,以便后续查找同一模型不会访问数据库。

因此缓存结果,您可以在每个视图中单独检索类型。

但考虑编写单个函数或模型方法的可能性,而不是在视图中复制代码。