我想要的是检索属于外键模型的所有字段。
我的模型例如:
class BaseProduct(models.Model):
name = models.CharField(max_length=256)
variant = models.CharField(max_length=256, default='N/A')
type = models.ForeignKey(ProductType)
class ProductType(models.Model):
name = models.CharField(max_length=256,blank=False,null=False)
sofa = models.ForeignKey(SofaProduct, blank=True, null=True)
toaster = models.ForeignKey(ToasterProduct, blank=True, null=True)
这些只是示例,可以有任意数量的ProductType模型,每个模型具有任意数量的字段。
在我的模板中,我可以使用BaseProduct ID显示BaseProduct的所有字段。我要显示的是FK的所有字段。
例如,如果BaseProduct中的type = Sofa,我需要检索并显示所有Sofa字段以及BaseProduct字段。
(免责声明:我倾向于给出很长的答案。您必须为此原谅我)
架构设计的第一条规则-它应该反映您的实际业务逻辑(不是您要注意的实际业务操作,而是关系的含义)。例如,如果我有一个班级,则Person
可以创建一个Pet
带有foreginKey的班级,该班级可以Person
转换为-每个人都可以养多只宠物。
如果将这种逻辑应用于您的架构,我们将看到ProductType
该类具有对Sofas和Toasters都具有ForeignKey的类,这意味着每个Toaster可以具有多个Sofas,反之亦然。上次检查时,我从未听说过带烤面包机的沙发。
换句话说-您需要考虑您实际上在试图实现的目标。我猜这BaseProduct
是一个具有共同领域的基础类,而Sofa和Toaster是不同类型的产品。由于它们是不同的,因此它们具有自己的特殊字段,并且不应该相关,因此将它们作为单独的模型是有意义的。那么,为什么还要ProductType
呢?要定义名称Toaster
?您已经在定义整个模型!为什么需要将其名称保留在其他表上(而不是总是返回的某些自定义方法"I am a toaster, hear me roar"
)?
我最好的猜测是,您希望能够随时随地定义新的产品类型。但是,如果打算在模型级别上将它们分开,则必须为每个新产品创建一个模型。而且,如果您希望能够使用来简单地定义一个新模型ProductType
,那么您要么需要一个Product类来管理它们,要么想要一个复杂的动态系统来动态创建新模型。
让我们分解一下这些选项:
创建通用产品和类型类,就像您在此处所做的那样:
class ProductType(models.Model):
name = models.CharField(max_length=256,blank=False,null=False)
class Product(models.Model):
name = models.CharField(max_length=256)
variant = models.CharField(max_length=256, default='N/A')
type = models.ForeignKey(ProductType)
现在,每种产品只能是一种类型,您可以随时随地创建新的类型。当然,这意味着所有Product对象将共享相同的字段,并且是非常有限的。你不会有每种类型相同的灵活性,就像您之前(只沙发字段),但另一方面,它会更容易创建动态类型的对象-你只需定义一个新的ProductType
和BAM你有一个整体新产品组。
创建一个基本的抽象产品模型,并为每种新型产品定义一个新的子模型。您将为每个模型都拥有更多的灵活性,但是定义新类型将始终需要定义一个新模型并为其建立一个表。使用这种方案,您根本不需要ProductType
对象,因为不同的模型定义了不同的类型(无需重复)。
您可以为该过程创建某种管理页面,但设置起来并不容易,最终可能会发现自己的表太多(如果您有时需要查询所有产品,这会特别成问题-将不得不联接很多不同的表,这不是很有效)。
*好吧,实际上比这要复杂得多,但是关于如何组合它们的解释太长了,即使是我的回答也是如此。如果它看起来在您的头上,那就不要管它了。如果您对非关系数据库的工作方式有一些了解,则可以自己解决
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句