擅长:python、mysql、java
<p>我想你想做的是:</p>
<p>从某个类别中拥有一个可以在继承层次结构上的项类型。iten可以有不同的类型并生成不同的东西,这听起来像一个继承结构(例如Item>;PriceFixedItem和Item>;VariablePriceItem)。在</p>
<p>通过这种方式,您可以尝试组成一个数据结构来存储和恢复数据库中的数据。你能试着这样做吗:</p>
<p>创建一个引用他自己的模型,创建一个类别树,可以是:</p>
<pre><code>class Category(models.Model):
parent = models.ForeignKey('self') # Here category will refer to it self
name = models.CharField()
</code></pre>
<p>现在您的物品只能引用一个类别,您可以将这里的物品转换为更具动态性的物品:</p>
^{pr2}$
<p>我们现在将有不同类型的项目:</p>
<pre><code>class FixedPriceItem(Item):
pass
class VariablePriceItem(Item):
price_tax = models.FloatField()
</code></pre>
<p>现在最好的是,我们如何有这个结构,Django可以解决你的问题,但是如何呢?很简单,看这个:</p>
<pre><code>class UserItem(models.Model):
item = models.ForeignKey(Item)
</code></pre>
<p>从现在起,你有一个单一的对象类型来管理用户项,这是非常好的维护。我在这里看到的最重要的一点是,你试图在数据库结构上解决这个问题,但是当你在像Django这样的ORM框架上编程时,你不必太在意你的数据库结构,你需要在编程语言上解决你的问题,在这个例子中是Python,因此,使用OO概念解决这个问题很简单,比如这个。另一件重要的事是你一生都要牢记的一个概念:拥有数据的对象就是关心数据的对象。如果你在错误的地方实现了你的控制逻辑,你将不得不写得更多,哭得更多,在这个例子中,你必须让Item对象关心它们将呈现、计算或存储他的数据。不要试图在用户的类上实现控件,当您有另一种类型的项时,这将非常有价值,并且您需要再放一个<code>if</code>来验证是否像这样或那样使用此项。在</p>