[英]How to join two tables by keys in django queryset
I have two tables with fk in one of them. 我有两张桌子,其中一张是fk。
parent: 父母:
+----+---------+
| Id | Name |
+----+---------+
| 1 | Test #1 |
| 2 | Test #2 |
| 3 | Test #3 |
+----+---------+
and child: 和孩子:
+----+---------+-----------+
| Id | Traffic | parent_id |
+----+---------+-----------+
| 1 | 1000 | 1 |
| 2 | 2000 | 3 |
+----+---------+-----------+
I need to make a queryset for my form to join tables by keys, something like: 我需要为表单创建一个查询集以通过键将表连接起来,例如:
select p.parent_id, p.traffic, c.name from child c, parent p where c.parent_id = p.id
Is there any simple way to do it? 有什么简单的方法吗?
EDIT : Ok, I'll show real sample what I need to have. 编辑 :好的,我将显示真正的样品。 There are two models Server and Resources: 服务器和资源有两种模型:
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
and: 和:
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
Form: 形成:
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',
]
I need to show on my template a selectbox ("server" field from ProjectNewForm) what contains public_name from Server model like text for option tag and Resources.server.id like a value. 我需要在模板上显示一个选择框(ProjectNewForm中的“服务器”字段),其中包含服务器模型中的public_name(如选项标签的文本)和Resources.server.id(如值)。
Finaly I found how to do it (thanks ppl from pyha forum) 最终我找到了解决方法(感谢pyha论坛的ppl)
Form: 形成:
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
)
So, now I can use server field in the template like: 因此,现在我可以使用模板中的服务器字段:
{% render_field form.server class="form-control required" %}
and get well formed result: 并获得良好的结果:
<select class="form-control required" name="server">
<option value="1">Test #1</option>
<option value="3">Test #3</option>
</select>
I'm not sure, maybe there is a better solution for this kind of task, but this sample works for me. 我不确定,也许对于这种任务有更好的解决方案,但是此示例对我有用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.