如何从 Django 中的一对多关系中检索数据?

Eng*_*san 6 django django-templates django-models one-to-many django-views

我正在使用 django 1.10 制作我的个人网站

这是技能应用程序的模型:

from __future__ import unicode_literals

from django.db import models


# Create your models here.
class Skill(models.Model):
    name = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
        return self.name

    def __str__(self):
        return  self.name


class Subskill(models.Model):
    skill = models.ForeignKey(Skill, on_delete=models.CASCADE)
    name = models.CharField(max_length=256)
    link = models.CharField(max_length=256)
    created_at = models.DateTimeField(auto_now=False, auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True, auto_now_add=False)

    def __unicode__(self):
        return self.name

    def __str__(self):
        return self.name
Run Code Online (Sandbox Code Playgroud)

并查看:

from django.shortcuts import render
from skill.models import Skill,Subskill


# Create your views here.
def home(request):        
    skill = Skill.objects.all()
    subskill =Subskill.objects.all()    
    context = {'skills':skill,
               'subskills':subskill}
    return render(request, 'skill.html', context)
Run Code Online (Sandbox Code Playgroud)

这是我的模板页面:

技能.html

{% block skill %}
{% for subskill in subskills %}
{{subskill.skill.name}}
{{subskill.name}}
{% endfor %}
{% endblock skill %}
Run Code Online (Sandbox Code Playgroud)

假设有一个名为 web 设计的技能,它有两个子技能,分别是 html 和 css。我想在视图页面中渲染为技能名称,它是两个子名称:

网页设计

html

CSS

但它呈现为像网页设计 Html 网页设计 CSS

请帮我解决这个问题。

Sar*_*iev 5

您可以对技能本身 进行相关查询https://docs.djangoproject.com/en/1.10/topics/db/queries/#backwards-lated-objects

# example
skill_obj = Skill.objects.all()[0]
subskills = skill_obj.subskill_set.all()
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下

def home(request):        
    skills = Skill.objects.all().prefetch_related('subskill_set') # optimizing
    context = {'skills':skills}
    return render(request, 'skill.html', context)
Run Code Online (Sandbox Code Playgroud)

在模板中

{% for skill in skills %}
    {{skill.name}}
    {% for subskill in skill.subskill_set.all %}
        {{subskill.name}}
    {% endfor %}
{% endfor %}
Run Code Online (Sandbox Code Playgroud)