想在django管理页面中为多个表

时间:2018-03-16 14:31:17

标签: python mysql django django-models django-admin

我目前正在研究django 2.0.2管理页面。我有三张桌子,分别是代谢物,基因和#39;和#的反应。'每个类的结构定义如下:

class Genes(models.Model):
    id = models.CharField(primary_key=True, max_length=255)
    name = models.CharField(max_length=255, blank=True, null=True)
    notes = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Genes'


class Metabolites(models.Model):
    id = models.CharField(primary_key=True, max_length=255)
    name = models.CharField(max_length=255, blank=True, null=True)
    compartment = models.CharField(max_length=255, blank=True, null=True)
    charge = models.CharField(max_length=255, blank=True, null=True)
    formula = models.CharField(max_length=255, blank=True, null=True)
    notes = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Metabolites'


class Reactions(models.Model):
    id = models.CharField(max_length=255, primary_key=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    metabolites = models.TextField(blank=True, null=True)
    lower_bound = models.CharField(max_length=255, blank=True, null=True)
    upper_bound = models.CharField(max_length=255, blank=True, null=True)
    gene_reaction_rule = models.TextField(blank=True, null=True)
    subsystem = models.CharField(max_length=255, blank=True, null=True)
    notes = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'Reactions'

正如您所看到的,“反应”反应如下:课堂上还包括代谢产物'零件。典型的反应实际上涉及两种以上的代谢物。我想要做的是,在管理页面上创建一个搜索字段(不是每个类的页面),当我输入反应ID时,搜索结果可以显示反应和所有涉及的代谢物,当我输入在代谢物中,搜索结果可以显示该代谢物的信息以及该代谢物所涉及的所有反应。

这可能吗?有人能告诉我怎么做吗?

感谢您帮助我!

1 个答案:

答案 0 :(得分:0)

修改

这描述了实现这一目标的“老派”方式。这似乎是django的许多领域的用例。我没有在我的项目中遇到这种需要;所以,我还没有研究过django中的多对多功能。我建议阅读django文档,了解如何使用多个字段。

此处描述的方式将实现数据中所需的连接。但是,我怀疑使用多对多字段设置django管理员会更容易,更直接。

结束修改

你想为metabolites_in_reaction创建另一个模型,它只包含自己的主键,反应的外键和代谢物的外键。

class ReactionMetabolites(models.Model):
    reaction = models.ForeignKey(Reactions, on_delete=models.CASCADE)
    metabolite = models.ForeignKey(Metabolites, on_delete=models.CASCADE)

这里也可能适合多对多的领域;我还没有真正想出多个领域。

编辑2:

在模型中进行这些更改后,您需要制作并应用迁移以将更改应用于数据库。

python manage.py makemigrations
python manage.py migrate