我有三个模型:Zone,Stage和ZoneStage以及ManyToMany关系。
背后的重点是我有多个区域,每个区域都有多个阶段。对于每个阶段的每个区域,我想显示某些值,这就是我创建ZoneStage模型的原因。
我不知道如何根据下面的图片显示值。我以为我可以通过以下方式做到:
e.g。 对于区域中的objectz: 对于阶段中的对象: 对于zone_stage中的objectzs:
这里有一些条件
或
e.g。 试试过滤器?
虽然,我需要一些指导和指导,阅读有关内容,如何做等等,如果有任何反馈可以让我的生活更容易解决这个问题,我将不胜感激。
这就是我得到的:
我的模特:
class Zone(models.Model):
ZONE_N = (
('Z2','Z2'),
('Z4','Z4'),
('Z6.1','Z6.1'),
('Z9LH','Z9LH'),
)
zone_name = models.CharField(max_length=5, choices=ZONE_N, primary_key=True)
zone_number = models.CharField(max_length=5,blank=True)
class Meta:
ordering = ('zone_name',)
def __unicode__(self):
return self.zone_name
class Stage(models.Model):
STAGE_N = (
('S1','S1'),
('S2','S2'),
('S3','S3'),
('S4','S4'),
)
stage_number = models.CharField(max_length=3, choices=STAGE_N, primary_key=True)
stage_name = models.CharField(max_length=50)
zones = models.ManyToManyField('Zone', through='ZoneStage', related_name='status')
class Meta:
ordering = ('stage_number',)
def __unicode__(self):
return self.stage_number
class ZoneStage(models.Model):
zone = models.ForeignKey(Zone)
stage = models.ForeignKey(Stage)
value = models.CharField(max_length=10)
class Meta:
ordering = ('zone',)
def __unicode__(self):
return '%s %s' % (self.zone, self.stage)
我的观点:
def index(request):
zs = ZoneStage.objects.all()
z = Zone.objects.all()
s = Stage.objects.all()
context = {'zone_stage': zs, 'zone': z, 'stage': s}
return render(request, 'index.html', context)
我的模板:
<table border="1">
<tr>
<td></td>
<td></td>
{% for object in zone %}
<td>{{ object.zone_name }}</td>
{% endfor %}
</tr>
{% for stages in stage %}
<tr>
<td>{{ stages.stage_number }}</td>
<td>{{ stages.stage_name }}</td>
{% for values in stages.zonestage_set.all|dictsort:"zone.zone_name" %}
<td>{{ values.value}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
答案 0 :(得分:1)
由于您的ZoneStage
是intermediate
模型,zoneid
和stageid
应该是ForeignKey
,而不是ManyToMany
。见这里的例子:
https://docs.djangoproject.com/en/1.8/topics/db/models/#intermediary-manytomany
如果你看一下你的结构,你会发现它有意义。由于您的ZoneStage
是交叉点,因此它们不能多对多。每个ZoneStage
都会有一个唯一的Zone
和一个唯一的Stage
。
完成此操作后,您可以通过这种方式访问这些值,例如:
<table border="1">
<tr>
<td></td>
<td>{{ object.zone }}</td>
{% for object in zone|dicsort:"zone_name" %}
<td>{{ object.zone_name }}</td>
{% endfor %}
</tr>
{% for objectS in stage %}
<tr>
<td>{{ objectS.stage_no }}</td>
<td>{{ objectS.stage_name }}</td>
{% for zonestages in objectS.zonestage_set.all|dictsort:"zoneid.zone_name" %}
<td>{{ zonestages.zonestage}}</td>
{% endfor %}
</tr>
{% endfor %}
</table>
编辑:
如果每个交叉点都有一个值,则以前的解决方案有效如果没有其他方法可以这样做:
<table border="1">
<tr>
<td></td>
<td>{{ object.zone }}</td>
{% for object in zone|dicsort:"zone_name" %}
<td>{{ object.zone_name }}</td>
{% endfor %}
</tr>
{% for objectS in stage %}
<tr>
<td>{{ objectS.stage_no }}</td>
<td>{{ objectS.stage_name }}</td>
{% for zones in zone|dicsort:"zone_name" %}
<td>
{% for zonestages in objectS.zonestage_set.all %}
{% if zonestages.zone == zones %} {{ zonestages.zonestage}}{% endif %}
{% endfor %}
</td>
{% endfor %}
</tr>
{% endfor %}
</table>