Django不必要地查询每个对象的数据库
My models.py: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
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
)