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

2024-05-08 15:59:00 发布

您现在位置:Python中文网/ 问答频道 /正文

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

家长:

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

和孩子:

^{pr2}$

我需要为窗体创建一个queryset,以便按键连接表,类似于:

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',
        ]

我需要在我的模板上显示一个selectbox(“ProjectNewForm中的server”字段),它包含来自服务器模型的公共名称,比如选项标记和资源.server.id就像一个价值观。在


Tags: nameidfalsetrueservermodelsformspublic
1条回答
网友
1楼 · 发布于 2024-05-08 15:59:00

最后我找到了怎么做(感谢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
                              )

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

^{pr2}$

得到良好的结果:

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

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

相关问题 更多 >