Django不必要地查询每个对象的数据库

Django不必要地查询每个对象的数据库,django,django-models,django-templates,django-views,Django,Django Models,Django Templates,Django Views,My models.py: from django.db import models from django.contrib.auth.models import User class SkillCategory(models.Model): title = models.CharField(max_length=255) def __unicode__(self): return self.title class Meta: ve

My models.py:

from django.db import models
from django.contrib.auth.models import User


class SkillCategory(models.Model):
    title = models.CharField(max_length=255)

    def __unicode__(self):
        return self.title

    class Meta:
        verbose_name_plural = "Skill Categories"


class Skill(models.Model):
    title = models.CharField(max_length=255)
    category = models.ForeignKey(
        SkillCategory, default=None, null=True, blank=True
    )

    def __unicode__(self):
        return self.title


class UserProfile(models.Model):
    user = models.OneToOneField(User)
    skill = models.ManyToManyField(Skill)
    avatar = models.URLField(
        max_length=400, default=None, null=True, blank=True
    )

    def __unicode__(self):
        return self.user.username
My views.py:

def ShowUserProfile(request, username=None, template_name='user_profile.html'):
    if not username:
         username = request.user.username

    profile = get_object_or_404(
        UserProfile.objects.select_related(), user__username=username
    )
    ...
在我的模板中,我这样迭代:

 ...
 {% if skill.category.title == 'Some Skill' %}
   {% for skill in profile.skill.all %}
     <li>{{ skill }}</li>
   {% endfor %}
 {% endif %}
 ...

select\u related
不处理很多关系。查看,它通过运行两个查询并在Python中连接结果来处理许多字段

通过创建SQL联接并在select语句中包含相关对象的字段来选择与_相关的工作。因此,select_related将获取同一数据库查询中的相关对象。但是,为了避免跨“多”关系加入会导致更大的结果集,select_related仅限于单值关系-外键和一对一

另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_-related无法完成的,此外,select_-related还支持外键和一对一关系。它还支持预取GenericRelation和GenericForeignKey


select\u related
不处理很多关系。查看,它通过运行两个查询并在Python中连接结果来处理许多字段

通过创建SQL联接并在select语句中包含相关对象的字段来选择与_相关的工作。因此,select_related将获取同一数据库查询中的相关对象。但是,为了避免跨“多”关系加入会导致更大的结果集,select_related仅限于单值关系-外键和一对一

另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_-related无法完成的,此外,select_-related还支持外键和一对一关系。它还支持预取GenericRelation和GenericForeignKey


select\u related
不处理很多关系。查看,它通过运行两个查询并在Python中连接结果来处理许多字段

通过创建SQL联接并在select语句中包含相关对象的字段来选择与_相关的工作。因此,select_related将获取同一数据库查询中的相关对象。但是,为了避免跨“多”关系加入会导致更大的结果集,select_related仅限于单值关系-外键和一对一

另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_-related无法完成的,此外,select_-related还支持外键和一对一关系。它还支持预取GenericRelation和GenericForeignKey


select\u related
不处理很多关系。查看,它通过运行两个查询并在Python中连接结果来处理许多字段

通过创建SQL联接并在select语句中包含相关对象的字段来选择与_相关的工作。因此,select_related将获取同一数据库查询中的相关对象。但是,为了避免跨“多”关系加入会导致更大的结果集,select_related仅限于单值关系-外键和一对一

另一方面,prefetch_-related对每个关系执行单独的查找,并在Python中执行“连接”。这允许它预取多对多和多对一对象,这是使用select_-related无法完成的,此外,select_-related还支持外键和一对一关系。它还支持预取GenericRelation和GenericForeignKey


Django的
select\u related
不适用于
多对多关系。

检查Django的
选择相关的
不适用于
多对多关系。

检查Django的
选择相关的
不适用于
多对多关系。

检查Django的
选择相关的
不适用于
多对多关系。

检查

谢谢!因此正确的查询如下所示:
profile=get\u object\u或\u 404(UserProfile.objects.prefetch\u related('skill\uu category'),user\uu username=username)
谢谢!因此正确的查询如下所示:
profile=get\u object\u或\u 404(UserProfile.objects.prefetch\u related('skill\uu category'),user\uu username=username)
谢谢!因此正确的查询如下所示:
profile=get\u object\u或\u 404(UserProfile.objects.prefetch\u related('skill\uu category'),user\uu username=username)
谢谢!因此正确的查询如下所示:
profile=get\u object\u或\u 404(UserProfile.objects.prefetch\u related('skill\uu category'),user\uu username=username)
def ShowUserProfile(request, username=None, template_name='user_profile.html'):
    if not username:
         username = request.user.username
    profile = get_object_or_404(
        UserProfile.objects.prefetch_related(
            'skill__category'), user__username=username
    )