进行查询ManyToMany关系

时间:2016-09-05 15:53:37

标签: python django orm models

我有一个名为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模板中查找来自affected_segment模型的movementRehabilitationSession字段的内容。

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

我的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 %}

但是当我通过网址访问我的模板时,我得到了这个:

enter image description here

当然,RehabilitationSession模型没有显式声明affected_segmentmovement字段,因为ManyToMany关系以这种方式创建了另一个中间模型/表:

enter image description here

通过Django Shell,我可以进行查询,浏览一些表/模型

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给我的支持,我还提取了将其附加在表格中的移动字段。

{% 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

之类的东西

1 个答案:

答案 0 :(得分:1)

正如您所说,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来显示所选内容的可读值。