繁体   English   中英

如何在Django queryset中通过键连接两个表

[英]How to join two tables by keys in django queryset

我有两张桌子,其中一张是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(如值)。

最终我找到了解决方法(感谢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>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM