2010-04-14 66 views
3

這與this question中提出的問題有些相關,但我試圖用抽象基類來做到這一點。從Django中的其他模型填充模型?

對於這個例子的目的,讓使用這些模型:

class Comic(models.Model): 
    name = models.CharField(max_length=20) 
    desc = models.CharField(max_length=100) 
    volume = models.IntegerField() 
    ... <50 other things that make up a Comic> 

    class Meta: 
     abstract = True 

class InkedComic(Comic): 
    lines = models.IntegerField() 

class ColoredComic(Comic): 
    colored = models.BooleanField(default=False) 

在視圖中可以說我們得到,因爲示蹤劑的InkedComic id參考,犯錯我的意思是,着墨完成繪製線條和它的時間添加顏色。一旦視圖添加了我們想要將ColoredComic保存到數據庫的所有顏色。

顯然,我們可以做

inked = InkedComic.object.get(pk=ink_id) 
colored = ColoredComic() 
colored.name = inked.name 
etc, etc. 

但實際上它會是不錯的事情:

colored = ColoredComic(inked_comic=inked) 
colored.colored = True 
colored.save() 

我試圖做

class ColoredComic(Comic): 
    colored = models.BooleanField(default=False) 

    def __init__(self, inked_comic = False, *args, **kwargs): 
     super(ColoredComic, self).__init__(*args, **kwargs) 
     if inked_comic: 
      self.__dict__.update(inked_comic.__dict__) 
      self.__dict__.update({'id': None}) # Remove pk field value 

但事實證明了ColoredComic.objects.get(pk=1)通話將pk粘貼到inked_comic關鍵字中,這顯然不是意圖。 (並且實際上導致int沒有dict例外)

我的大腦在這個時候被炸,我是否錯過了某些明顯的東西,或者是否有更好的方法來做到這一點?

回答

3

如何處理這個類的靜態方法?

colored = ColoredComic.create_from_Inked(pk=ink_id) 
colored.colored = True 
colored.save() 

未經檢驗的事,但這種效果(使用你的代碼從上面)

class ColoredComic(Comic): 
    colored = models.BooleanField(default=False) 

    @staticmethod 
    def create_from_Inked(**kwargs): 
     inked = InkedComic.objects.get(**kwargs) 
     if inked: 
      colored = ColoredComic.objects.create() 
      colored.__dict__.update(inked.__dict__) 
      colored.__dict__.update({'id': None}) # Remove pk field value 
      return colored 
     else: 
      # or throw an exception... 
      return None 
+0

測試這一點,我唯一需要改變 ColoredComic.objects.create()爲ColoredComic(),因爲我只想在該點處理該模型的本地副本(在保存之前需要更多業務邏輯)。 我現在可以回去工作了!謝謝! – 2010-04-14 21:49:44

0

對於簡單的情況下,這將工作:

inked = InkedComic.object.get(pk=ink_id) 
inked.__class__ = ColoredComic 
inked.colored = True 
inked.save() 
+1

我實際上是從這樣的事情開始的,但是如果你像這樣改變類,那麼你並沒有在着墨項目上得到所有的ColoredComic屬性,所以save()失敗了。在這個例子中,通過執行inked.colored = True來解決這個問題,但隨着子類屬性數量的增長,這變得非常痛苦。 (我的實際問題有六打額外attrs,其中大多數是默認或可選) 但是,對於這個簡單的例子,事實上工作:) – 2010-04-14 22:06:03