多对多关系。在 def __str__ 方法中返回字段

ManyToMany Relationships. Returning fields in def __str__ method

我有两个模型:

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,
        blank=False,
        verbose_name='Segmento afectado',
        help_text='Ingrese uno o mas segmentos corporal de miembros superiores'
    )

    class Meta:
        verbose_name_plural = 'Segmentos corporales'

    def __str__(self):
        return "%s" % self.affected_segment

Movement模型。请最后回顾一下本模型的__str__方法:

class Movement(models.Model):
    type = models.CharField(
        max_length=255,
        verbose_name='Tipo de movimiento'
    )

    corporal_segment_associated = models.ManyToManyField(
        AffectedSegment,
        blank=True,
        verbose_name='Segmento corporal asociado')

    class Meta:
        verbose_name = 'Movimiento'

    def __str__(self):
        return "{},{}".format(self.type, self.corporal_segment_associated)

我有另一个名为 RehabilitationSession 的模型,我希望可以在其中选择多个 affected_segments 和多个动作,例如:

class康复训练(models.Model):

affected_segment = models.ManyToManyField(
    AffectedSegment,
    verbose_name='Segmento afectado',
    #related_name='affectedsegment'
)
movement = models.ManyToManyField(
    Movement,  # Modelo encadenado
    verbose_name='Movimiento',
    #related_name = 'movement'
)

在我的 Django Admin 中,当我转到 RehabilitationSession 模型时,我在 movement 字段中看到以下内容:

我知道在 ManyToMany 关系中,中间 table 是用两个 table 的 ID 字段创建的,这使得 m2m 关系方式:

我的问题是:

如何才能在我的 Movement 模型中访问我想在 __str__ 方法中调用的 corporal_segment_associated 字段?

任何方向都非常有用 :)

问题是 self.corporal_segment_associated 不是相关项目的列表,它是一个 ManyRelatedManager。当您调用 str(self.corporal_segment_associated) 时,它 return 是您在屏幕截图中看到的 AffectedSegment.None 字符串。

要获取相关的片段,您可以self.corporal_segment_associated.all()。这将 return 一个相关对象的查询集。然后,在 __str__ 方法中使用它之前,您必须将此查询集转换为字符串。例如,您可以这样做:

class Movement(models.Model):
    def __str__(self):
        corporal_segment_associated = ", ".join(str(seg) for seg in self.corporal_segment_associated.all())
        return "{},{}".format(self.type, corporal_segment_associated)

__str__ 方法中访问 self.corporal_segment_associated.all() 可能不是一个好主意。这意味着 Django 将对下拉列表中的每个项目执行额外的 SQL 查询。您可能会发现这会导致性能不佳。