Django从多个表中检索数据

时间:2013-04-04 13:36:05

标签: django orm

我有两个MySQL模型:

class registration(models.Model):
   name = models.CharField(max_length=30)
   email = models.EmailField()
   password = models.CharField(max_length=30)
   company = models.CharField(max_length=30)


class personal_details(models.Model):
   reg = models.ForeignKey(registration)
   job = models.CharField(max_length=30)
   experience = models.IntegerField(default=0)

我想使用经验和公司作为关键字过滤细节。我想从我的HTML页面中的两个表中获取并显示详细信息(姓名,电子邮件,公司,工作,经验)。

4 个答案:

答案 0 :(得分:3)

details = personal_details.objects.filter(experience=1, 
    reg__company="YourCompany").select_related()

{% for detail in details %}
    Name: {{ detail.reg.name }}
    Email: {{ detail.reg.email }}
    Company: {{ detail.reg.company }}
    Job: {{ detail.job }}
    Experience: {{ detail.experience }}<br/>
{% endfor %}

答案 1 :(得分:2)

如果没有对您的问题进行更深入的解释,很难正确回答您的问题,但这里有:

一个选项:

# views.py
def mypage(request):

    details = Personal_details.objects.select_related().filter(experience=3)
    names = [d.reg.name for d in details]

    return render(request, 'mypage.html', {'names': names})

# html

<p>People with 3 experience:</p>
<ul>
    {% for name in names %}
        <li>{{ name }}</li>
    {% empty %}
        <li>Nobody has 3 experience!</li>
    {% endfor %}
</ul>

另一种选择:

# views.py
def mypage(request):

    details = Personal_details.objects.select_related().all()
    names = [d.reg.name for d in details]
    info = zip(details, names)

    return render(request, 'mypage.html', {'info': info})

#html

<ul>
    {% for detail, name in info %}
        {% if detail.experience == 0 %}
            <li>{{ name }} has 0 experience</li>
        %{ elif detail.experience == 1 %}
            <li>{{ name }} has 1 experience</li>
        # and so on and so forth....
        {% endif %}
    {% endfor %}
</ul>

注意我如何将您的模型(即类)名称大写。这是惯例,你应该坚持下去。

所以这可能是你希望做的,也可能不是,它可能不是最好的方法,但希望它会让你开始自己的解决方案。我建议您阅读Django viewstemplate tags

答案 2 :(得分:1)

首先得到一个personal_details列表(经验质量为9),如下所示:

p_details_list = personal_details.objects.filter(experience=9)

之后,您可以访问每个元素的reg属性,它会为您提供相应的registration对象

答案 3 :(得分:0)

不确定您希望数据明智,但您可以通过两种方式从personal_details对象ForeignKey关系中提取数据。

反向关系通过_set进行,我只是在这里拍摄:

reg = registration.objects.get(pk=1)
print reg.personaldetails_set.job

否则,通过正常的FK方式。

details = personal_details.objects.get(pk=1)
print details.reg.name