【问题标题】:Django - How do I create a model that contains a collection of its own type?Django - 如何创建一个包含自己类型集合的模型?
【发布时间】:2018-07-13 18:19:13
【问题描述】:

我正在创建的模型中的一个字段是其自身类型的实例列表。我如何在 django 中做到这一点?我找不到任何有关如何执行此操作的文档..

这有点像我在说的,但不起作用,因为尚未定义 Component 类(也可能出于其他原因)。

class Component(models.Model):
    name = models.CharField()
    description = models.CharField()
    status_ok = models.BooleanField()
    subcomponents = models.ForeignKey(Component)

一个简单演示概念的常规类:

class Component:
    def __init__(self, name, description, status_ok, *subcomponents):
        self.name = name
        self.description = description
        self.status_ok = status_ok
        self.subcomponents = []
        for subcomponent in subcomponents:
            if isinstance(subcomponent, Component):
                self.subcomponents.append(subcomponent)
            else:
                raise TypeError(subcomponent)

【问题讨论】:

  • 请注意,ForeignKey 表示 关系,而不是子关系,因为它只能指向一个元素。所以它应该被称为“parent_component”,而related_name 可以是“subcomponents”。
  • @scharette 是的,请

标签: python django python-3.x django-models containment


【解决方案1】:

要引用相同的模型,请使用普通 Python 语法 self,但作为字符串,

Class Component(models.Model):
    name = models.CharField()
    description = models.CharField()
    status_ok = models.BooleanField()
    subcomponents = models.ForeignKey('self')

【讨论】:

  • 我试过这个并得到错误:django.db.utils.OperationalError: no such table: Monitor_monitoredcomponent
  • (实际的类名是MonitoredComponent,它在一个叫Monitor的django应用中,所以是Monitor_monitoredcomponent)
  • 这是正确答案。这也是此问题stackoverflow.com/questions/11214175/… 的转贴。该错误可能是您的模型和数据库不同步或其他迁移问题的原因。试试 python manage.py migrate
  • @Dap 我不知道这个答案是写的,但不是在 m 答案的评论中发布它,而是提出一个更合适的重复标志。
  • @Dap 我刚刚再次运行 python manage.py migrate 并且没有要应用的迁移
猜你喜欢
  • 1970-01-01
  • 2014-01-21
  • 2015-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
相关资源
最近更新 更多