【问题标题】:Django retrieve data from multiple tablesDjango 从多个表中检索数据
【发布时间】:2013-03-26 15:01:15
【问题描述】:

我有两个 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 页面中的两个表中获取并显示详细信息(姓名、电子邮件、公司、工作、经验)。

【问题讨论】:

  • 请详细说明您的问题!这是什么?

标签: django orm


【解决方案1】:
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 %}

【讨论】:

  • 它不起作用..只显示工作名称和电子邮件不显示..提供更多提示..
  • 哦抱歉,必须是reg 而不是registration
  • 感谢我更新了我的问题,请参考并发布您的答案
【解决方案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

【讨论】:

    【解决方案3】:

    首先得到一个personal_details(经验等于9)的列表,如下所示:

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

    之后你可以访问每个元素的reg属性,它会给你对应的registration对象

    【讨论】:

    • 查询集上有一个select_related 方法,可以从两个表中获取数据。例如上面的personal_details.objects.filter(experience=9).select_related('reg') 将同时获取personal_details 和注册数据。
    【解决方案4】:

    不确定您想要什么数据,但您可以通过两种方式从 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
    

    【讨论】:

      猜你喜欢
      • 2020-07-28
      • 2018-10-03
      • 2019-04-30
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多