如何在Django中为对象实现多种数据类型?

时间:2011-04-05 02:24:09

标签: python django

我想知道将各种数据类型与Django中的对象相关联的最佳方法。一些类型应该是字符串,布尔值,图像文件,列表中的选择或链接。例如,假设您有一个产品型号。对于产品X,您需要添加图像属性,模型名称的字符串和链接。对于产品Y,可能的属性是图像,重量小数。设置它的最佳方法是什么?是否有任何可用的包或类似的包?

2 个答案:

答案 0 :(得分:1)

您可以创建一个允许每个字段为空/空值的模型。或者,如果要设置具有相似所需属性或属于类别的产品类型,请使用django的模型继承。看起来您要求的是可选属性,只需要您在模型中定义可选字段(第一个示例)。

null ref,空白ref

没有继承:

class Product(models.Model):
    name = models.CharField()
    image = models.ImageField(blank=True, null=True)
    weight = models.DecimalField(blank=True, null=True)

继承ref

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

    class Meta:
        abstract = True

class ProductTypeA(Product):
    image = models.ImageField()

class ProductTypeB(Product):
     weight = models.DecimalField()

修改

了解docsdocs

中的关系
class Product(models.Model):
    name = models.CharField()

class ProductImage(models.Model):
    product = models.ForeignKey(Product)
    image = models.ImageField()

class ProductWeight(models.Model):
    product = models.ForeignKey(Product)
    weight = models.DecimalField()

class ProductURL(models.Model):
    product = models.ForeignKey(Product)
    url = models.URLField()

class ProductFile(models.Model):
    product = models.ForeignKey(Product)
    file = models.FileField()

ProductXXXXX通过外键与产品型号相关。这是一对多的关系,因此对于每个产品,您可以拥有许多产品.xxx。

例如,您可以制作产品:

product_one = Product(name="product_one")
product_one.save()

现在您要为该产品添加权重:

weight = ProductWeight(product=product_one, weight=3.55)
weight.save()

要查看与产品相关的所有权重:

product_one_weights = product_one.weight_set.all()
for weight in product_one_weights:
    print weight

这使您可以拥有具有不同“属性”的产品。

                      product_one
                           |
       -----------------------------------------
       |             |            |            |
 ProductWeight ProductImage ProductImage ProductFile

                      product_two
                           |
                     --------------
                     |            |            
                ProductURL   ProductImage 

答案 1 :(得分:0)

基于类型的结构的RDBMS不是为此而设计的。例如,拿Google的大表,不要抱怨你存储的东西(即产品A属性类型可能与产品B完全不同,但两者都是Product类型。)

您需要基于对象的存储系统,具有类型灵活性。

您确定要不惜一切代价吗?我们仍然可以做到这一点,但有很多开销。这是伪代码。

Model Product:
        id (primary key)

Model AttributeType:
   """
   Defines various data types available for storage.
   ex: (1, 'INT') or (2,'STRING') or (3, 'FLOAT')
   """
      id:
      name:

Model ProductAttributes:
   """
   Stores various attributes of a product
   Ex: (P1,ATT1,100) or (P1, ATT3, 10.5) or (P2, ATT2, "ABCD")
   """
      FK-> Product
      FK-> AttributeType
      Name 'String'
      Value Blob