2012-08-10 184 views
0

在Django中,我有以下models.py如何創建「知道」它是什麼類別的django數據庫模型?

class Product(RandomPrimaryIdModel): 
    title = models.CharField(max_length=20, blank=True, null=True) 
    price = models.CharField(max_length=20, blank=True, null=True) 
    condition = models.CharField(max_length=20, blank=True, null=True) 

class Mattress(Product): 
    length = models.CharField(max_length=50) 
    size = models.CharField(max_length=5) 

class Pillow(Product): 
    shape= models.CharField(max_length=50) 
    comfort= models.CharField(max_length=5)  

的想法是,有一個「產品」模型和幾個「產品類型」的車型。我正在嘗試創建一個與兩者相關的數據庫方案。最終目標是,當我允許訪問product_type未知的對象的主ID時,我可以簡單地查詢/過濾該對象以查明product_type與對象的關係。

我知道這聽起來有點混亂,但我該如何去實現正確的方式?目前的方案(上面的方案)不是我相信的正確解決方案。

+1

最好不要對'CharField'使用'null = True',ref [doc](https://docs.djangoproject.com/en/1.4/ref/models/fields/):「避免使用null on基於字符串的字段,如CharField和TextField,除非你有一個很好的理由......「 – okm 2012-08-10 06:05:04

+0

一旦你有產品類型,你會做什麼?將這種行爲作爲產品類型的方法來實施會不會更好?因此,例如,「牀墊」的「描述」方法將使用其長度和尺寸,而枕頭的使用方式則使用其形狀和舒適度。然後代碼不會關心它是什麼類型的對象,它只會得到它的描述。在面向對象的框架中,通常顯式地測試類是一個紅旗。 – Spacedman 2012-08-10 08:32:35

回答

1

根據docs on multi-table inheritance,您可以引用模型的小寫字母名稱。你的情況,找出「產品類型」你會做這樣的事情:

product = Product.objects.get(id=12) 
try: 
    mattress = product.mattress 
    is_mattress = True 
except Mattress.DoesNotExist: 
    is_mattress = False 

,你可以抽象出這樣的helper方法,會做的測試,爲您和返回類型爲字符串或枚舉某種程度上。

0

如果你有一個對象的引用,你不能使用類似:

p = Product.objects.get(id=1) 

class_of_p = str(p.__class__) 

,然後解析生成的字符串

"<class 'whatever.models.Pillow'>" 

找到你需要什麼?道歉,如果我失去了一些東西。

相關問題