显示外键模型的所有字段

时间:2014-11-06 08:37:45

标签: django database django-models

我想要的是检索属于外键模型的所有字段。

我的模型例如:

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,我需要检索并显示所有沙发字段以及BaseProduct字段。

3 个答案:

答案 0 :(得分:2)

(免责声明:我倾向于给出很长的答案。你必须原谅我这个)

架构设计的第一条规则 - 它应该反映你的真实世界business logic(不是actual business action介意你,只关注关系的含义)。例如,如果我有一个班级Person,我可以创建一个类Pet,其中foreginKey为Person,转换为 - 每个人都可以有多个宠物。

如果我们将该逻辑应用于您的模式,我们会发现ProductType是一个对沙发和烤面包机都有foreignKey的类,这意味着每个Toaster可以有多个沙发,反之亦然。我上次检查时,从未听说过沙发上有烤面包机。

换句话说 - 你需要思考你在这里想要实现的目标。我猜BaseProduct是一个具有共同字段的基本类,而Sofa和Toaster是不同类型的产品。由于它们不同,它们有自己的特殊领域,不应该相关,因此将它们作为单独的模型是有意义的。那为什么你甚至需要ProductType?要定义名称Toaster?你已经定义了整个模型!为什么需要将其名称保存在不同的表中(而不是,例如,总是返回"I am a toaster, hear me roar"的一些自定义方法)?

我最好的猜测是,您希望能够随时随地定义新类型的产品。但是,如果您打算在模型级别上将它们分开,则必须为每个新产品创建一个模型。如果您希望能够使用ProductType简单地定义新模型,那么您需要有一个Product类来管理它们,或者您需要一个可以动态创建新模型的复杂动态系统。

让我们打破这些选择:

  1. 像在那里一样创建通用产品和类型类:

    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你有一整套新产品。

  2. 创建基本的abstract产品型号,并为每种新型产品定义新的子型号。您将为每个模型提供更多灵活性,但定义新类型将始终需要定义新模型并为其设置表格。使用此方案,您根本不需要ProductType对象,因为不同的模型定义了不同的类型(不需要双重性)。

    您可以为流程创建某种管理页面,但它不会 很容易设置,你可能会发现自己最终有太多的表 (如果您有时需要查询,这可能会特别成问题 在所有产品上 - 你必须加入很多不同的表, 这不是很有效率。)

  3. non-relational databasedynamic-models know howdisco *
  4. 一起使用

    *好吧,它实际上比这更复杂,但关于如何组合它们的解释太长了,即使对我的回答也是如此。如果它似乎在你的脑海中,那就忘记吧。如果你对非关系数据库的工作原理有所了解,你可以自己搞清楚

答案 1 :(得分:0)

你的问题有点不清楚。

我认为您希望Django模态表单显示模态的所有字段。

def ListForm(Forms.form):
    model = MyModel
    fields='__all__'          #Sets display all
    fk_name ="Model_to_use"   #Is needed when your model has more then one fk

Django model form

答案 2 :(得分:0)

您可以使用_set访问相关对象。例如,如果您有两个这样的模型:

class MyModel(models.Model):
    name = models.CharField(max_length=200)
    somedata = models.CharField(max_length=200)

class AnotherModel(models.Model):
    name = models.CharField(max_length=256,blank=False,null=False)
    referral = models.ForeignKey(MyModel)
    type = models.CharField(max_length=256,blank=False,null=False)

您可以使用

访问AnotherModel的名称字段
>>> m = MyModel.objects.get(id=1)
>>> m.AnotherModel_set.all()[0].name

请参阅:https://docs.djangoproject.com/en/dev/topics/db/queries/#related-objects

另外,您应该重新考虑模型结构,yuvi pointed out