从django中的三个模型获取特定数据
Getting spesific data from three models in django
我开始使用 django,我想从三个相关模型中获取特定数据。
我的模特是
class Institution(models.Model):
name = models.CharField(max_length=100, unique=True)
...
class Certification(models.Model):
name = models.CharField(max_length=100)
...
class Course(models.Model):
name = models.CharField(max_length=100)
institution = models.ForeignKey(Institution)
certification = models.ForeignKey(Certification)
在我的 html 页面中,我想显示由认证订购的特定机构提供的课程。像这样
name of a particular institution I
certification 1
list courses that offer certification 1
certification 2
list courses that offer certification 2
...
我当前的模板是
{{institution.name}}
{% for certification in preselected_certifications %}
<h1> {{ certification.name }} </h1>
<ul>
{% for course in courses %}
<li>{{ course.name }}</li>
{% endfor %}
</ul>
{% endfor %}
我的观点
def detail(request, slug):
context = RequestContext(request)
context_dict = {'slug_requested': slug}
try:
institution = Institution.objects.get(slug=slug)
courses = Course.objects.filter(etablissement=etablissement)
context_dict['courses'] = courses
context_dict['institution'] = institution
except Institution.DoesNotExist:
pass
return render_to_response('institutition/details.html', context_dict, context)
我的问题是如何定义 "preselected_certifications" 使其仅包含所选机构中所有课程提供的认证,但不重复任何认证
问题:
how define "preselected_certifications" so it contains only certifications offered by all courses in the selected institution, but without repeating any certification
我不确切地知道你想如何表示这些信息(意思是,你想要哪些属性可用),但你想像下面这样:
def detail(request, slug):
...
institution = Institution.objects.get(slug=slug)
# `select_related` not strictly necessary
courses = institution.course_set.all().select_related('certification')
context_dict['courses'] = courses
context_dict['institution'] = institution
现在,每个 course
对象都可以访问其 certification
关系,您 可以 遍历它们以显示唯一的对象。
但是,如果您想从一开始就确保这些 certification
是唯一的,一种方法是使用另一个查询:
institution = Institution.objects.get(slug=slug)
courses = institution.course_set.select_related('certification')
certification_ids = courses.values_list('certification_id', flat=True).distinct()
preselect_certifications = Certification.objects.filter(id__in=certification_ids)
最后一个查询将为您提供特定机构的唯一认证。
似乎 Certification
应该与 Institution
有潜在关系,但是,不是吗?
是的,非常感谢,现在我在我的模板中使用以下代码
{% for certification in preselect_certifications %}
{{certification.name}}
{% for course in courses %}
<ul>
{% if certification = course.certification %}
<li>{{ course.name }}</li>
{% endif %}
</ul>
{% endfor %}
{% endfor %}
它工作得很好,但有没有其他方法可以避免使用
{% if certification = course.certification %}
?
再次感谢
我开始使用 django,我想从三个相关模型中获取特定数据。 我的模特是
class Institution(models.Model):
name = models.CharField(max_length=100, unique=True)
...
class Certification(models.Model):
name = models.CharField(max_length=100)
...
class Course(models.Model):
name = models.CharField(max_length=100)
institution = models.ForeignKey(Institution)
certification = models.ForeignKey(Certification)
在我的 html 页面中,我想显示由认证订购的特定机构提供的课程。像这样
name of a particular institution I
certification 1
list courses that offer certification 1
certification 2
list courses that offer certification 2
...
我当前的模板是
{{institution.name}}
{% for certification in preselected_certifications %}
<h1> {{ certification.name }} </h1>
<ul>
{% for course in courses %}
<li>{{ course.name }}</li>
{% endfor %}
</ul>
{% endfor %}
我的观点
def detail(request, slug):
context = RequestContext(request)
context_dict = {'slug_requested': slug}
try:
institution = Institution.objects.get(slug=slug)
courses = Course.objects.filter(etablissement=etablissement)
context_dict['courses'] = courses
context_dict['institution'] = institution
except Institution.DoesNotExist:
pass
return render_to_response('institutition/details.html', context_dict, context)
我的问题是如何定义 "preselected_certifications" 使其仅包含所选机构中所有课程提供的认证,但不重复任何认证
问题:
how define "preselected_certifications" so it contains only certifications offered by all courses in the selected institution, but without repeating any certification
我不确切地知道你想如何表示这些信息(意思是,你想要哪些属性可用),但你想像下面这样:
def detail(request, slug):
...
institution = Institution.objects.get(slug=slug)
# `select_related` not strictly necessary
courses = institution.course_set.all().select_related('certification')
context_dict['courses'] = courses
context_dict['institution'] = institution
现在,每个 course
对象都可以访问其 certification
关系,您 可以 遍历它们以显示唯一的对象。
但是,如果您想从一开始就确保这些 certification
是唯一的,一种方法是使用另一个查询:
institution = Institution.objects.get(slug=slug)
courses = institution.course_set.select_related('certification')
certification_ids = courses.values_list('certification_id', flat=True).distinct()
preselect_certifications = Certification.objects.filter(id__in=certification_ids)
最后一个查询将为您提供特定机构的唯一认证。
似乎 Certification
应该与 Institution
有潜在关系,但是,不是吗?
是的,非常感谢,现在我在我的模板中使用以下代码
{% for certification in preselect_certifications %}
{{certification.name}}
{% for course in courses %}
<ul>
{% if certification = course.certification %}
<li>{{ course.name }}</li>
{% endif %}
</ul>
{% endfor %}
{% endfor %}
它工作得很好,但有没有其他方法可以避免使用
{% if certification = course.certification %}
?
再次感谢