2014-01-06 53 views
0

我試圖編寫一個函數來存儲幾個字段的連接sting,包括一些存儲在M2M關係的關係表中的函數。 下面是代碼:django查找到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

的問題是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將有相反。關係屬性:一個用於與substance和一個與許多與rel_med_subs一2的許多2一對多的關係後,您找到正確的反向經理,那麼你可以使用s.id_subs.names.strength

也請利用你的類名和使用。 corrent命名(rel_med_subs應該命名爲MedicineSubstanc eRelation)!