2017-04-10 77 views
0

我正在嘗試在django 1.10中開發一個應用程序。我想知道如何在創建時以一對多的關係初始化對象的屬性。我們稱之爲兩個相關對象'Set'(一)和'Element'(許多)。在django中爲對象創建不可編輯的屬性

對象'Set'的屬性'name'取決於日期和已經創建的相同類型的其他對象的數量。在這種情況下,我將這些值初始化爲我感興趣的值時沒有問題。

但是,對象'元素'的屬性'name'取決於創建的其他元素的數量,也取決於'name'它與之相關的'Set'。我如何獲得這些信息?

我試圖創建一個方法使用作爲變量的ForeignKey值,但我只是獲得一個錯誤的回報。我想是這樣的:

// in models.py 
def get_element_name(set_id): 
    set = Set.objects.get(pk=set_id) 
    set_name = set.name 

    return set_name +'other stuff' 

class Set(models.Model): 
    // set attributes 

class Element(models.Model): 
    set = models.ForeignKey(Set, on_delete=models.CASCADE) 
    name = models.CharField(max_length=250, editable=False, default=get_element_name(set.pk)) 

我可以看到這是錯誤的(在ForeignKey的無PK屬性),但我無法找到任何其他解決我的問題。


(我想什麼獲得做法:將集的名稱是由字母製成,對應於創作的一年,即每一個新的對象被創建時增加了一些A001是2017年創造的第一套,第二套是A002,而B001是2018年的第一套......元素的代碼應該是集合的名稱加上一個字母,根據創建的其他元素的數量例如A001A是A001的第一個元素,A001B的第二個等...)

+0

你的問題是有點我不清楚。你能解釋一下你想要元素的名字是什麼嗎?也許通過一個例子? – Dunno

+0

你能提供你正在得到的錯誤嗎? –

+0

我收到錯誤:AttributeError:'ForeignKey'對象沒有屬性'pk' – user2504163

回答

0

就你而言,我認爲你不能直接在字段定義中設置默認值。相反,你可以在Element模型save方法設置此默認:

def save(self, *args, **kwargs): 
    self.name = self.set.name + 'other stuff' 
    # or self.name = get_element_name(self.set.id) if you prefer, but it does an unusefull call to db 
    return super(Element, self).save(*args, **kwargs) 
相關問題