很多关系。返回def __str__方法中的字段

时间:2016-09-27 15:56:59

标签: django python-3.x django-models many-to-many

我有两种模式:

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和多个移动,如下所示:

类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'
)

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

enter image description here

据我所知,在ManyToMany关系中,创建了一个中间表,其中包含两个表的ID字段,这两个表以这种方式形成m2m关系:

enter image description here

我的问题是:

如何在我的Movement模型中实现这一点?我可以使用corporal_segment_associated方法访问我想要调用的__str__字段?

任何方向都非常有用 :)

1 个答案:

答案 0 :(得分:3)

问题是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()方法中访问__str__可能不是一个好主意。这意味着Django将为下拉列表中的每个项目执行额外的SQL查询。您可能会发现这导致性能不佳。