2011-10-26 60 views
3

我有一些機型,像這樣的關係:Django的:使內存的關係,而不保存到數據庫

class Item(model.Model): 
    name = models.CharField() 

class Group(models.Model): 
    item = models.ManyToManyField(Item) 

class Serie(models.Model): 
    name = models.CharField() 
    chart = models.ForeignKey(Chart) 
    group = models.ForeignKey(Group) 

class Chart(models.Model): 
    name = models.CharField() 

我需要動態創建一個圖表對象,而不保存到數據庫。但我不能這樣做,因爲Django在分配關係時嘗試使用對象主鍵。

我只是想Group.add(Item())工作,而不必將對象保存到數據庫。

有沒有簡單的解決方法呢?

+0

我相信你在圖表傳遞給要顯示的前端?爲什麼不使用普通的python對象? –

+0

因爲我有這些對象的其他方法,我想使用它們而不必在兩個類上重寫它們 –

回答

0

編輯:似乎這裏描述的方法是不夠的Django允許添加到ManyToMany關係。

您是否嘗試將primary_key=Trueunique=True添加到Item模型的name屬性中。如果您有可能在運行中創建name,那麼應該使用Group.add(Item("item_name_here"))

我沒有測試它,但我認爲你的方式失敗了,因爲add()想要使用主鍵,默認情況下它是保存到數據庫時分配的自動增量ID。

+0

我需要保留模型的主鍵,我只是希望Djanto不要查找主鍵如果我不想保存任何對象。 –

+0

@FC在這種情況下,我猜想這是不可能的。順便說一句。我認爲即使添加我建議的主鍵也不夠。 – Lycha

3

回想起這裏未來的讀者着想:

我已經通過定義一個代表類中的關係,並檢查羯羊對象的屬性私有屬性解決這個用例可以得到從檢索DB或駐留在內存中。

下面是一個簡單的例子:

class Parent(models.Model): 
    _children = [] 
    name = models.CharField(max_length=100) 

    @property 
    def children(self): 
     if _children: 
      return self._children 
     else: 
      return self.children_set.all() 

    def set_virtual_children(self, value): # could use a setter for children 
     self._children = value # Expose _children to modification 

    def some_on_the_fly_operation(self): 
     print(','.join([c.name for c in self.children])) 


class Children(models.Model): 
    parent = models.ForeignKey(Parent) 
    name = models.CharField(max_length=100) 

這樣一來,我可以設置「虛擬兒童」,並使用所有「對飛」的定義的方法

相關問題