查询多对多关系

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_segmentmovement 字段的内容。

我正在尝试以这种方式传递这些数据:

我的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_segmentmovement 字段,因为 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 来显示选项的可读值。