【问题标题】:How to join two tables by keys in django queryset如何在 django 查询集中通过键连接两个表
【发布时间】:2016-07-14 05:51:19
【问题描述】:

我有两张桌子,其中一张有 fk。

父母:

+----+---------+
| Id |  Name   |
+----+---------+
|  1 | Test #1 |
|  2 | Test #2 |
|  3 | Test #3 |
+----+---------+

和孩子:

+----+---------+-----------+
| Id | Traffic | parent_id |
+----+---------+-----------+
|  1 |    1000 |         1 |
|  2 |    2000 |         3 |
+----+---------+-----------+

我需要为我的表单创建一个查询集以通过键连接表,例如:

select p.parent_id, p.traffic, c.name from child c, parent p where c.parent_id = p.id

有什么简单的方法吗?

编辑: 好的,我会展示我需要的真实样本。 服务器和资源有两种模式:

class Server(models.Model):
    public_name = models.CharField(_(u'public name'),
                                   max_length=60,
                                   blank=False,
                                   null=False,
                                   unique=False)
    server_ident = models.CharField(_(u'server identificator'),
                                    max_length=100,
                                    blank=False,
                                    null=False,
                                    unique=True)
    class Meta:
        db_table = 'server'
        ordering = ('public_name',)
        abstract = False

    def __unicode__(self):
        return self.public_name

和:

class Resources(models.Model):
    server = models.ForeignKey(Server,
                               on_delete=models.CASCADE)
    traffic_left = models.FloatField(_(u'traffic left'),
                                     blank=False,
                                     null=False,
                                     default=0.0)
    requests_left = models.IntegerField(_(u'requests left'),
                                        blank=False,
                                        null=False,
                                        default=0)
    class Meta:
        db_table = 'resources'
        abstract = False

表格:

class ProjectNewForm(forms.Form):
    servers_query = Resources.objects.all()........
    project_name = forms.CharField(required=True,
                                   min_length=2,
                                   max_length=14,
                                   label=_(u'Project name'))
    project_description = forms.CharField(required=True,
                                          max_length=2000,
                                          widget=forms.Textarea(
                                              attrs={'rows': 4}
                                          ),
                                          label=_(u'Project description'))

    server = forms.ModelChoiceField(queryset=servers_query,
                                    required=True,
                                    initial=0,
                                    widget=forms.Select,
                                    label=_(u'Server'))
    class Meta:
        fields = [
            'project_name',
            'project_description',
            'server',
        ]

我需要在我的模板上显示一个选择框(ProjectNewForm 中的“服务器”字段),其中包含来自服务器模型的 public_name,例如选项标签的文本和 Resources.server.id,例如值。

【问题讨论】:

  • 模型中有外键吗?显示定义。
  • @Daniel Roseman,确保类 Child(models.Model): prnt = models.ForeignKey(Parent, on_delete=models.CASCADE)
  • 您应该先发布它,以及其他模型。但我还是不明白你想要达到什么目的;您希望对这个联合查询做什么?
  • @Daniel Roseman 我需要在我的模板中有一个选择框来显示 parent.name 之类的文本和 parent_id 之类的子表中的值
  • 你说的太含糊了。请编辑问题以显示输出的确切示例。

标签: python django django-forms django-queryset


【解决方案1】:

我终于找到了方法(感谢 pyha 论坛的 ppl)

表格:

def get_server_list():
    return Resources.objects.all().values_list('server_id',
                                               'server__public_name')

class ProjectNewForm(forms.Form):
    project_name = forms.CharField(required=True,
                                   min_length=2,
                                   max_length=14,
                                   label=_(u'Project name'))
    project_description = forms.CharField(required=True,
                                          max_length=2000,
                                          widget=forms.Textarea(
                                              attrs={'rows': 4}
                                          ),
                                          label=_(u'Project description'))
    server = forms.Field(required=True,
                         widget=forms.Select,
                         label=_(u'Server'))

    class Meta:
        fields = [
            'project_name',
            'project_description',
            'server',
        ]

    def __init__(self, *args, **kwargs):
        kwargs.setdefault('label_suffix', '')
        super(ProjectNewForm, self).__init__(*args, **kwargs)
        self.fields['server'] = \
            forms.ChoiceField(choices=
                              [(o[0], str(o[1])) for o in get_server_list()],
                              initial=1
                              )

所以,现在我可以在模板中使用服务器字段,例如:

{% render_field form.server class="form-control required" %}

并获得格式良好的结果:

<select class="form-control required" name="server">
  <option value="1">Test #1</option>
  <option value="3">Test #3</option>
</select>

我不确定,也许对于这类任务有更好的解决方案,但这个示例对我有用。

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-01-22
    • 2016-10-16
    • 1970-01-01
    • 2018-03-06
    • 2020-07-17
    • 2020-08-26
    相关资源
    最近更新 更多