加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Django使用外键查询的最佳实践

发布时间:2020-12-20 11:17:16 所属栏目:Python 来源:网络整理
导读:models.py class Category(models.Model): name = models.CharField(max_length=50)class SubCatergory(models.Model): parent_category = models.ForeignKey(Category) name = models.CharField(max_length=100) views.py def all_products(request):c = Ca
models.py

class Category(models.Model):
    name = models.CharField(max_length=50)

class SubCatergory(models.Model):
    parent_category = models.ForeignKey(Category)
    name = models.CharField(max_length=100)

views.py

def all_products(request):
c = Category.objects.all()
s = SubCatergory.objects.all()

return render_to_response('all_products.html',{'c':c,'s':s})

all_products.html

{% for category in c %}
    <h1>{{ category.name }}</h1>
    <ul>
        {% for sub in s  %}
        {% if category.id == sub.parent_category.id %}
            <li>{{ sub.name }}</li>
        {% endif %}
        {% endfor %}
    </ul>
{% endfor %}

只是想知道以上是否是外键查询的最佳实践.我在模板级别进行过滤(如果是category.id == sub …),我应该将其移动到模型或视图级别吗?

解决方法

如果只有一个子类别的深度,则以下代码不应成为问题:

{% for category in c %}
    <h1>{{ category.name }}</h1>
    <ul>
        {% for sub in category.subcatergory_set.all %}
            <li>{{ sub.name }}</li>
        {% endfor %}
    </ul>
{% endfor %}

但是,有一些优化技巧可以减少查询次数,因为每个循环都会进行查询.我现在想想一个.

实际上,我开始认为这是一个有趣的问题:最佳实践?

您的方法使用2个查询.我的方法是使用django实践,但会进行多次查询.

为了防止多次查询,您基本上必须在视图中执行与模板相同的操作,即迭代SubCatergory,在python中提取ID并将每个ID集分组到Category上的属性上.

我不知道这个问题的答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读