【问题标题】:How to retrieve data from one to many relations in django?如何在 django 中从一对多关系中检索数据?
【发布时间】:2017-01-12 15:17:20
【问题描述】:

我正在使用 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

并查看:

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)

这是我的模板页面:

skill.html

{% block skill %}
{% for subskill in subskills %}
{{subskill.skill.name}}
{{subskill.name}}
{% endfor %}
{% endblock skill %}

假设,有一个技能叫网页设计,它有两个子技能,分别是 html 和 css。 我想在视图页面中呈现技能名称,它是两个子名称:

网页设计

HTML

CSS

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

请帮我解决这个问题。

【问题讨论】:

    标签: django django-models django-templates django-views one-to-many


    【解决方案1】:

    你可以对技能本身做realted query https://docs.djangoproject.com/en/1.10/topics/db/queries/#backwards-related-objects

    # example
    skill_obj = Skill.objects.all()[0]
    subskills = skill_obj.subskill_set.all()
    

    或者在你的情况下

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

    在模板中

    {% for skill in skills %}
        {{skill.name}}
        {% for subskill in skill.subskill_set.all %}
            {{subskill.name}}
        {% endfor %}
    {% endfor %}
    

    【讨论】:

    • 它显示错误,就像'QuerySet'对象没有属性'subskill_set'
    • 阅读更新的答案 skill = skill.subskil_set.all() 是为了在技能是对象而不是查询集时应用
    • 重新格式化一下 {% 技能中的技能 %} {{subskill.skill.name}} {% 技能中的子技能 %}
    • @Engr.TanbirHasan 再次复制并粘贴代码。我稍微改了一下。
    • 哇!这是工作。大老板。你是一个真正的摇滚明星。谢谢你。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多