我正在尝试编写一个函数来存储多个字段的串联sting,包括一些存储在M2M关系的关系表中的字段。 这是代码:
class substance(models.Model):
name = models.Charfield()
...
class rel_med_subs(models.Model):
id_med = models.ForeignKey(medication, related_name='relation_med')
id_subs = models.ForeignKey(substance, related_name='relation_subs')
order = models.IntegerField()
strength = models.FloatField(null=True, blank=True)
strength_unit = models.ForeignKey(units)
class medication(models.Model):
name = models.Charfield()
substance = models.ManyToManyField(substance, through='rel_med_subs')
autogenerated = models.CharField(blank=False, default='')
...
def save(self, force_insert=False, force_update=False):
self.autogenerated = u'%s' % (' '.join[(u'%s %s'(s.name, s.strength) for s in self.rel_med_subs.order_by('order')])
self(medication,self).save(force_insert,force_update
当我只询问名称时,该功能正常,但如果我尝试从关系表中提取属性,django抱怨强度不是物质模型的一部分。
如何从关系中获取属性到我的自动生成字段?
谢谢!
答案 0 :(得分:1)
问题是name
和strength
属性属于不同的对象(strength
属于rel_med_subs
,name
到substance
)!您无法通过(s.name, s.strength) for s in self.rel_med_subs.order_by('order')
理解来引用这两者 - s
只能name
或strength
。
似乎rel_med_subs属性是substance
类型的对象的关系管理器,而不是类型rel_med_subs
的对象。使用medication
检查dir
的属性,看看哪个是rel_med_subs
的经理名称(可能类似于rel_med_subs_set
- 我真的记不起来了,总是请使用dir
进行检查。但请确保medication
将具有两个反向关系属性:一个用于多个2个与substance
有很多关系,一个用于一个2许多人rel_med_subs
。找到正确的反向管理员后,您可以使用s.id_subs.name
和s.strength
。
请将您的班级名称大写并使用正确命名(rel_med_subs应命名为MedicineSubstanceRelation)!