多对多关系。在 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 查询。您可能会发现这会导致性能不佳。
我有两个模型:
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 查询。您可能会发现这会导致性能不佳。