【问题标题】:Is it possible to add a 'through'model to a child model on Django?是否可以在 Django 上向子模型添加“通过”模型?
【发布时间】:2012-07-28 10:21:39
【问题描述】:

这是我正在尝试做的一个简明示例:

class Entity(models.Model):
    name = models.CharField(max_length=70)

class Individual(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

class BookingAgent(Entity)
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee")

class Role(models.Model):
    person = models.ForeignKey(Individual)
    company = models.ForeignKey(Entity)
    position = models.CharField(max_length=70)

基本上,我有一个名为Entity 的父类,它存储公司的所有基本信息,即地址等。然后我有一个BookingAgent,它是Entity 的子类。当我尝试在 BookingAgent 模型上创建直通关系时,它不起作用。我得到了错误:

'staff'是通过模型Role手动定义的m2m关系,没有Individual和BookingAgent的外键

但是当在 Entity` 模型中定义了直通关系时,它会起作用。

我的目标是让每个实体都有一份员工或成员个人列表。我想我明白为什么它不起作用,但我想不出一个优雅的解决方案。

谢谢!

更新:澄清一下,Entity 不是抽象基类,因为会有一些实体不是 BookingAgents、ManagementCompanies 等

【问题讨论】:

  • 技术上,你所拥有的没有任何问题。如果BookingAgent 是一个Entity,那么您应该能够将其保存到任何接受EntityForeignKey。但是,对于 Django 设置 M2M API 的方式,这是行不通的。为了使 API 正常运行,它必须将相关管理器附加到关系的双方,即 IndividualBookingAgent,但您的代码会导致相关管理器被添加到 IndividualEntity。你可能会称这是一个错误,但我想如果你提交它,Django 开发人员会标记它 WONTFIX。
  • 感谢@ChrisPratt!我查了经理,但我仍然对如何解决这个问题感到困惑。你能澄清一下吗?
  • 重点是我认为你可以解决这个问题。您需要为每个特定关系使用不同的“通过”模型。

标签: django inheritance model


【解决方案1】:

我认为您需要将“RoleTest”更改为“Role”,并且您需要有一个指向 BookingAgent 的外键,而不是 Entity(而且 Entity 不应该是一个抽象基类吗?)

class BookingAgent(Entity)
    staff = models.ManyToManyField(Individual, through='Role', related_name="employee")

class Role(models.Model):
    person = models.ForeignKey(Individual)
    company = models.ForeignKey(BookingAgent)

【讨论】:

  • 谢谢! “RoleTest”错字仅在我的问题中。我不能将外键设为“BookingAgent”,因为我也有“ManagementCompany”等。或者我应该为每个人制作一个单独的“角色”模型吗?
  • 哎哟。这不是那么简单。您可以为Entity 的每个子类制作一个单独的表格。或者,您可以合并Entity 的所有子类并给它一个type 字段,该字段将是“预订代理”、“管理公司”等之一。或者您可以使用 Django 的内容类型来建立从角色到的通用关系任何型号。可能这些都不理想。
  • 感谢您的反馈。我的一些子类有不同的字段,所以我不会将它们合并到“实体”中,而是采用通用关系路线。本教程有所帮助:link
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 1970-01-01
  • 2018-08-29
相关资源
最近更新 更多