2012-08-10 186 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'>" 

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

相关问题