django在M2M关系中查找导航表

时间:2014-01-06 13:43:24

标签: python django many-to-many lookup

我正在尝试编写一个函数来存储多个字段的串联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抱怨强度不是物质模型的一部分。

如何从关系中获取属性到我的自动生成字段?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题是namestrength属性属于不同的对象(strength属于rel_med_subsnamesubstance)!您无法通过(s.name, s.strength) for s in self.rel_med_subs.order_by('order')理解来引用这两者 - s只能namestrength

似乎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.names.strength

请将您的班级名称大写并使用正确命名(rel_med_subs应命名为MedicineSubstanceRelation)!