我的模型.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
我的意见.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 %}
...
但是,如果我查看 Django 调试工具栏,我发现对于每个Skill
Django 都在查询 db 以获取Category
. 我select_related
在UserProfile
对象上使用,但它不影响查询的数量。肯定有更好的方法,让 Django 可以一次性获取所有Skill
相关的SkillCategory
参考资料?
编辑
根据准确的反馈,正确的视图如下所示:
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
)