我想知道将各种数据类型与Django中的对象相关联的最佳方法。一些类型应该是字符串,布尔值,图像文件,列表中的选择或链接。例如,假设您有一个产品型号。对于产品X,您需要添加图像属性,模型名称的字符串和链接。对于产品Y,可能的属性是图像,重量小数。设置它的最佳方法是什么?是否有任何可用的包或类似的包?
答案 0 :(得分:1)
您可以创建一个允许每个字段为空/空值的模型。或者,如果要设置具有相似所需属性或属于类别的产品类型,请使用django的模型继承。看起来您要求的是可选属性,只需要您在模型中定义可选字段(第一个示例)。
没有继承:
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()
修改强>
中的关系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