Python 如何在Django中为一个对象实现多种数据类型?
我想知道在Django中将各种数据类型与对象关联的最佳方法。某些类型应该是字符串、布尔值、图像文件、列表选项或链接。例如,假设您有一个产品模型。对于产品X,您需要添加图像属性、模型名称字符串和链接。对于产品Y,可能的属性是一个图像,一个权重小数。设置此项的最佳方式是什么?是否有任何软件包可以执行此操作或类似操作?您可以创建一个模型,允许每个字段使用空/空值。或者,如果您正在设置共享类似所需属性或属于类别的产品类型,则可以使用django的模型继承。看起来您要求的是可选属性,这只需要您在模型中定义可选字段(第一个示例) 空,空白 无继承:Python 如何在Django中为一个对象实现多种数据类型?,python,django,Python,Django,我想知道在Django中将各种数据类型与对象关联的最佳方法。某些类型应该是字符串、布尔值、图像文件、列表选项或链接。例如,假设您有一个产品模型。对于产品X,您需要添加图像属性、模型名称字符串和链接。对于产品Y,可能的属性是一个图像,一个权重小数。设置此项的最佳方式是什么?是否有任何软件包可以执行此操作或类似操作?您可以创建一个模型,允许每个字段使用空/空值。或者,如果您正在设置共享类似所需属性或属于类别的产品类型,则可以使用django的模型继承。看起来您要求的是可选属性,这只需要您在模型中定义
class Product(models.Model):
name = models.CharField()
image = models.ImageField(blank=True, null=True)
weight = models.DecimalField(blank=True, null=True)
继承:
编辑:
阅读和中的关系
ProductXXXXX通过外键与产品模型相关。这是一种一对多的关系,因此对于每种产品,您可以有多个productxxxx
例如,您可以制作以下产品:
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
这允许您拥有具有不同“属性”的产品
具有基于类型的结构的RDBMS不是为此而设计的。例如,以谷歌的大表为例,它不会抱怨你存储了什么(即,产品A属性类型可能与产品B完全不同,尽管两者都是产品类型) 您需要具有类型灵活性的基于对象的存储系统 你确定要不惜任何代价吗?我们仍然可以做到这一点,但需要大量的开销。这里是伪代码 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 模型产品: id(主键) 模型属性类型: """ 定义可用于存储的各种数据类型。 例如:(1,'INT')或(2,'STRING')或(3,'FLOAT') """ 身份证件: 姓名: 模型产品属性: """ 存储产品的各种属性 例如:(P1,附件1100)或(P1,附件3,10.5)或(P2,附件2,“ABCD”) """ FK->产品 FK->AttributeType 名称“字符串” 价值点
这些都是普通Django字段类型,您可以将它们放在普通Django模型中。不需要任何额外的或不同的东西。似乎你想要的一切都在这里:。您还需要什么?他希望与“产品”关联的对象类型是动态的。听起来您需要定义自己的类gcbirzan是正确的。对不起,我在问题中没有说得更清楚。我需要的数量和类型的属性是动态的。感谢您的回复。抱歉,我没有提到与产品关联的属性数量理论上应该是无限的,并且可以动态设置(在编码时,我不知道产品需要哪些属性)。你真的应该读一些关于数据库设计和关系数据库的书,但我编辑了我的答案,给你举个例子。这很有道理。谢谢
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
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