Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在Django中为一个对象实现多种数据类型?_Python_Django - Fatal编程技术网

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

Python 如何在Django中为一个对象实现多种数据类型?,python,django,Python,Django,我想知道在Django中将各种数据类型与对象关联的最佳方法。某些类型应该是字符串、布尔值、图像文件、列表选项或链接。例如,假设您有一个产品模型。对于产品X,您需要添加图像属性、模型名称字符串和链接。对于产品Y,可能的属性是一个图像,一个权重小数。设置此项的最佳方式是什么?是否有任何软件包可以执行此操作或类似操作?您可以创建一个模型,允许每个字段使用空/空值。或者,如果您正在设置共享类似所需属性或属于类别的产品类型,则可以使用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