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

2023-12-28

我有两个模型:

AffectedSegment model

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

And 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我希望允许选择多个受影响的段和多个移动,如下所示:

类 RehabilitationSession(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 field:

我明白,在ManyToMany关系,使用两个表的 ID 字段创建一个中间表,这使得m2m这种方式的关系:

我的问题是:

我怎样才能在我的Movement我可以访问的模型corporal_segment_associated我想要调用的字段__str__ method?

任何方向都非常有用 :)


问题是self.corporal_segment_associated不是相关项目的列表,而是ManyRelatedManager。你打电话时str(self.corporal_segment_associated),它返回AffectedSegment.None您在屏幕截图中看到的字符串。

要获取相关段,您可以执行以下操作self.corporal_segment_associated.all()。这将返回相关对象的查询集。然后,您必须先将此查询集转换为字符串,然后才能在__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)

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多对多关系。在 def __str__ 方法中返回字段 的相关文章

随机推荐