我有两张桌子,其中一张是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',
]
我需要在模板上显示一个selectbox(来自ProjectNewForm的“服务器”字段),其中包含来自服务器模型的public_name,如option标签的文本和Resources.server.id的值。
答案 0 :(得分:0)
最终我找到了怎么做(感谢pyha论坛的人们)
形式:
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>
我不确定,也许这种任务有更好的解决方案,但这个示例适合我。