如何在Django模型中存储物品的分类和子分类最佳方式

2024-09-28 16:23:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我想储存一些像苹果这样的东西,它将被储存为“树果-苹果-富士-有机”,而将有更多的类别,如小麦,是“谷类谷物-小麦-柔软的白色冬天-斯蒂芬斯-有机”。在

class Item(models.Model):

    user = models.ForeignKey(User)
    type = models.CharField(max_length=100, default=None ,blank=True) #Cereal Grain
    commodity = models.CharField(max_length=100, default=None ,blank=True) #Wheat
    cl = models.CharField(max_length=100, default=None ,blank=True) #Soft White Winter
    variety = models.CharField(max_length=100, default=None ,blank=True) #Stephens
    market = models.CharField(max_length=100, default=None ,blank=True) #Organic

    def __str__(self):
        return u"%s" % (self.user)



class Shorten_Item(models.Model):

    user = models.ForeignKey(User)
    type = models.CharField(max_length=100, default=None ,blank=True) #Tree Fruit
    commodity = models.CharField(max_length=100, default=None ,blank=True) #Apple
    variety = models.CharField(max_length=100, default=None ,blank=True) #Fuji
    market = models.CharField(max_length=100, default=None ,blank=True) #Organic


    def __str__(self):
        return u"%s" % (self.user)

将有与这些表相关联的成本项目。在

^{pr2}$

User_Variable_Cost_Items和{}引用上表之一(而不是两者)的最佳方法是什么?在

谢谢


Tags: self苹果nonetruedefaultmodelslengthmax
2条回答

我想你想做的是:

从某个类别中拥有一个可以在继承层次结构上的项类型。iten可以有不同的类型并生成不同的东西,这听起来像一个继承结构(例如Item>;PriceFixedItem和Item>;VariablePriceItem)。在

通过这种方式,您可以尝试组成一个数据结构来存储和恢复数据库中的数据。你能试着这样做吗:

创建一个引用他自己的模型,创建一个类别树,可以是:

class Category(models.Model):
     parent = models.ForeignKey('self') # Here category will refer to it self
     name = models.CharField()

现在您的物品只能引用一个类别,您可以将这里的物品转换为更具动态性的物品:

^{pr2}$

我们现在将有不同类型的项目:

class FixedPriceItem(Item):
    pass

class VariablePriceItem(Item):
    price_tax = models.FloatField()

现在最好的是,我们如何有这个结构,Django可以解决你的问题,但是如何呢?很简单,看这个:

class UserItem(models.Model):
    item = models.ForeignKey(Item)

从现在起,你有一个单一的对象类型来管理用户项,这是非常好的维护。我在这里看到的最重要的一点是,你试图在数据库结构上解决这个问题,但是当你在像Django这样的ORM框架上编程时,你不必太在意你的数据库结构,你需要在编程语言上解决你的问题,在这个例子中是Python,因此,使用OO概念解决这个问题很简单,比如这个。另一件重要的事是你一生都要牢记的一个概念:拥有数据的对象就是关心数据的对象。如果你在错误的地方实现了你的控制逻辑,你将不得不写得更多,哭得更多,在这个例子中,你必须让Item对象关心它们将呈现、计算或存储他的数据。不要试图在用户的类上实现控件,当您有另一种类型的项时,这将非常有价值,并且您需要再放一个if来验证是否像这样或那样使用此项。在

如果可以重新组织模型,则可以使用模型继承(https://docs.djangoproject.com/en/1.8/topics/db/models/#model-inheritance

您的Item模型可能是Shorten_Item的子类,因为它只包含一个额外的字段cl = CharField()

您可以保持Shorten_Item不变,然后使Item从该模型继承:

class Item(Shorten_Item):
    cl = models.CharField(max_length=100, default=None ,blank=True)

现在在你的另一节课上

^{pr2}$

在检索Shorten项目的ID时,使用业务逻辑来确定是要将其用作Shorten_Item还是{}(需要时将其向下转换为Item

如果不能重新组织模型以从继承中获益,那么唯一的解决方案可能是使用item_id = IntegerField()作为“外键”,它将能够指向任何表,并且您必须自己编写更多的查询

相关问题 更多 >