查询多对多关系
Making queries ManyToMany relationships
我有一个名为 AffectedSegment
的模型,用于存储下肢片段选择。
class AffectedSegment(models.Model):
SEGMENTO_ESCAPULA = 'Escápula'
SEGMENTO_HOMBRO = 'Hombro'
SEGMENTO_CODO = 'Codo'
SEGMENTO_ANTEBRAZO = 'Antebrazo'
SEGMENTO_CARPO_MUNECA = 'Carpo/Muñeca'
SEGMENTO_MANO = 'Mano'
SEGMENT_CHOICES = (
(SEGMENTO_ESCAPULA, u'Escápula'),
(SEGMENTO_HOMBRO, u'Hombro'),
(SEGMENTO_CODO, u'Codo'),
(SEGMENTO_ANTEBRAZO, u'Antebrazo'),
(SEGMENTO_CARPO_MUNECA, u'Carpo/Muñeca'),
(SEGMENTO_MANO, u'Mano'),
)
affected_segment = models.CharField(
max_length=12,
choices=SEGMENT_CHOICES,
verbose_name='Affected Segment'
)
def __str__(self):
return "%s" % self.affected_segment
我有另一个名为Movement
的模型,用于存储与先前输入的下肢部分相关或相关的动作。
想法是一个段(AffectedSegment
对象)可以有很多动作,一个动作(Movement
对象)可以与一个或多个段相关联。
class Movement(models.Model):
type = models.CharField(
max_length=255,
verbose_name='Movement type'
)
corporal_segment_associated = models.ManyToManyField(
AffectedSegment,
blank=True,
verbose_name='Affected segment associated')
def __str__(self):
return "%s" % self.type
这两个模型,我在这个模型中引用
class RehabilitationSession(models.Model):
affected_segment = models.ManyToManyField(
AffectedSegment,
verbose_name='Segmento afectado',
#related_name='affectedsegment'
)
movement = models.ManyToManyField(
Movement, # Chained Model
verbose_name='Movement',
#related_name = 'movement'
)
我的主要疑问是如何在我的 html 模板中从 RehabilitationSession
模型中查找 affected_segment
和 movement
字段的内容。
我正在尝试以这种方式传递这些数据:
我的views.py文件
class RehabilitationSessionList(ListView):
queryset = RehabilitationSession.objects.all()
context_object_name = 'rehabilitationsessions'
template_name = 'finals_list.html'
我的 finals_list.html 模板是:
<thead>
<tr>
<th>Affected Segment</th>
</tr>
</thead>
<tbody>
{% for a in rehabilitationsessions %}
<tr>
<td>{{ a.affected_segment }}</td>
</tr>
</tbody>
{% endfor %}
但是当我通过 url 访问我的模板时,我得到了这个:
当然,RehabilitationSession
模型没有显式声明 affected_segment
和 movement
字段,因为 ManyToMany 关系创建了另一个中间 models/tables方式:
通过 Django Shell,我可以进行查询,浏览其中的一些 tables/models
In [21]: RehabilitationSession.objects.filter(movement__type='Extensión')
Out[21]: <QuerySet [<RehabilitationSession: Andrea Vermaelen>]>
In [24]: RehabilitationSession.objects.filter(affected_segment__affected_segment='Codo
...: ')
Out[24]: <QuerySet [<RehabilitationSession: Andrea Vermaelen>]>
我的问题是如何在我的视图中查询模板中出现的数据,
可能是我的模型定义不正确? ...
我知道这不应该很复杂,但我希望得到一些关于它的指导,因为我在康复课程中检索了一个人的片段和动作。
欢迎任何方向
更新
关于@Daniel-Roseman 给我的支持,我还提取了运动字段以将其附加到 table。
{% for a in rehabilitationsessions %}
{% for r in a.affected_segment.all %}
{% for l in a.movement.all %}
<tr>
<td>{{ a.id }}</td>
<td>{{ a.patient.full_name }}</td>
<td>{{ a.patient.user.birth_date }}</td>
<td>{{ a.patient.user.age }}</td>
<td>{{ a.patient.user.sex }}</td>
<td>{{ a.upper_extremity }} <br/><br/>
<strong>{{ a.pain_extremity }}</strong> </td>
<td>{{ a.patient.dominant_superior_member }}</td>
<td>{{ r.get_affected_segment_display }}</td>
<td>{{ l }}</td>
<td> <button type="button" class="btn btn-xs btn-info"><a href="{% url 'rehabilitationsessions:detail' a.id %}">Ver</a></button></td>
<td><a href="{% url 'rehabilitationsessions:edit' a.id %}">Editar</a></td>
</tr>
{% endfor %}
{% endfor %}
{% endfor %}
以及它所显示的运动。作品。
但是当我编辑寄存器以添加一些额外的 movement
或额外的 affected_segment
时,行为是显示了这个额外的段或移动的一个新记录,尽管它不是数据库中的新记录,是同一记录的新行...
我认为这是由于我的三个 for 循环造成的...
是这样的 https://cldup.com/JRKuSRFPuD.png
如您所说,affected_segment
是一个多对多字段。也就是说它指的是很多段(而且名字好像不对,应该是复数)。所以不能直接输出,需要遍历:
{% for a in rehabilitationsessions %}
{% for r in a.affected_segment.all %}
{{ r.get_affected_segment_display }}
{% endfor %}
{% endfor %}
请注意,由于您在 AffectedSegment 上感兴趣的字段(本身称为 affected_segment
)已分配选项,您可以使用 get_affected_segment_display
来显示选项的可读值。
我有一个名为 AffectedSegment
的模型,用于存储下肢片段选择。
class AffectedSegment(models.Model):
SEGMENTO_ESCAPULA = 'Escápula'
SEGMENTO_HOMBRO = 'Hombro'
SEGMENTO_CODO = 'Codo'
SEGMENTO_ANTEBRAZO = 'Antebrazo'
SEGMENTO_CARPO_MUNECA = 'Carpo/Muñeca'
SEGMENTO_MANO = 'Mano'
SEGMENT_CHOICES = (
(SEGMENTO_ESCAPULA, u'Escápula'),
(SEGMENTO_HOMBRO, u'Hombro'),
(SEGMENTO_CODO, u'Codo'),
(SEGMENTO_ANTEBRAZO, u'Antebrazo'),
(SEGMENTO_CARPO_MUNECA, u'Carpo/Muñeca'),
(SEGMENTO_MANO, u'Mano'),
)
affected_segment = models.CharField(
max_length=12,
choices=SEGMENT_CHOICES,
verbose_name='Affected Segment'
)
def __str__(self):
return "%s" % self.affected_segment
我有另一个名为Movement
的模型,用于存储与先前输入的下肢部分相关或相关的动作。
想法是一个段(AffectedSegment
对象)可以有很多动作,一个动作(Movement
对象)可以与一个或多个段相关联。
class Movement(models.Model):
type = models.CharField(
max_length=255,
verbose_name='Movement type'
)
corporal_segment_associated = models.ManyToManyField(
AffectedSegment,
blank=True,
verbose_name='Affected segment associated')
def __str__(self):
return "%s" % self.type
这两个模型,我在这个模型中引用
class RehabilitationSession(models.Model):
affected_segment = models.ManyToManyField(
AffectedSegment,
verbose_name='Segmento afectado',
#related_name='affectedsegment'
)
movement = models.ManyToManyField(
Movement, # Chained Model
verbose_name='Movement',
#related_name = 'movement'
)
我的主要疑问是如何在我的 html 模板中从 RehabilitationSession
模型中查找 affected_segment
和 movement
字段的内容。
我正在尝试以这种方式传递这些数据:
我的views.py文件
class RehabilitationSessionList(ListView):
queryset = RehabilitationSession.objects.all()
context_object_name = 'rehabilitationsessions'
template_name = 'finals_list.html'
我的 finals_list.html 模板是:
<thead>
<tr>
<th>Affected Segment</th>
</tr>
</thead>
<tbody>
{% for a in rehabilitationsessions %}
<tr>
<td>{{ a.affected_segment }}</td>
</tr>
</tbody>
{% endfor %}
但是当我通过 url 访问我的模板时,我得到了这个:
当然,RehabilitationSession
模型没有显式声明 affected_segment
和 movement
字段,因为 ManyToMany 关系创建了另一个中间 models/tables方式:
通过 Django Shell,我可以进行查询,浏览其中的一些 tables/models
In [21]: RehabilitationSession.objects.filter(movement__type='Extensión')
Out[21]: <QuerySet [<RehabilitationSession: Andrea Vermaelen>]>
In [24]: RehabilitationSession.objects.filter(affected_segment__affected_segment='Codo
...: ')
Out[24]: <QuerySet [<RehabilitationSession: Andrea Vermaelen>]>
我的问题是如何在我的视图中查询模板中出现的数据,
可能是我的模型定义不正确? ...
我知道这不应该很复杂,但我希望得到一些关于它的指导,因为我在康复课程中检索了一个人的片段和动作。
欢迎任何方向
更新
关于@Daniel-Roseman 给我的支持,我还提取了运动字段以将其附加到 table。
{% for a in rehabilitationsessions %}
{% for r in a.affected_segment.all %}
{% for l in a.movement.all %}
<tr>
<td>{{ a.id }}</td>
<td>{{ a.patient.full_name }}</td>
<td>{{ a.patient.user.birth_date }}</td>
<td>{{ a.patient.user.age }}</td>
<td>{{ a.patient.user.sex }}</td>
<td>{{ a.upper_extremity }} <br/><br/>
<strong>{{ a.pain_extremity }}</strong> </td>
<td>{{ a.patient.dominant_superior_member }}</td>
<td>{{ r.get_affected_segment_display }}</td>
<td>{{ l }}</td>
<td> <button type="button" class="btn btn-xs btn-info"><a href="{% url 'rehabilitationsessions:detail' a.id %}">Ver</a></button></td>
<td><a href="{% url 'rehabilitationsessions:edit' a.id %}">Editar</a></td>
</tr>
{% endfor %}
{% endfor %}
{% endfor %}
以及它所显示的运动。作品。
但是当我编辑寄存器以添加一些额外的 movement
或额外的 affected_segment
时,行为是显示了这个额外的段或移动的一个新记录,尽管它不是数据库中的新记录,是同一记录的新行...
我认为这是由于我的三个 for 循环造成的... 是这样的 https://cldup.com/JRKuSRFPuD.png
如您所说,affected_segment
是一个多对多字段。也就是说它指的是很多段(而且名字好像不对,应该是复数)。所以不能直接输出,需要遍历:
{% for a in rehabilitationsessions %}
{% for r in a.affected_segment.all %}
{{ r.get_affected_segment_display }}
{% endfor %}
{% endfor %}
请注意,由于您在 AffectedSegment 上感兴趣的字段(本身称为 affected_segment
)已分配选项,您可以使用 get_affected_segment_display
来显示选项的可读值。