如何在Django中将外部应用模型添加多个一的关系

5 投票
2 回答
630 浏览
提问于 2025-04-18 02:12

我的Django项目使用了django-helpdesk这个应用。

这个应用里面有一个叫做Ticket的模型。

我的应用里有一个Client模型,它应该和Ticket模型有一个一对多的关系,这样我就可以列出所有与特定客户相关的票据。

通常我会在Ticket模型里加上models.ForeignKey(Client),这样就能建立这种关系。但是因为这是一个外部应用,我不想去修改它(这样将来更新的时候可能会有问题)。

我对ManyToMany或者OneToOne关系没有问题,但我不知道怎么实现ManyToOne关系,也就是如何让外部应用的多个票据关联到我应用里的一个客户。

2 个回答

1

有(至少)两种方法可以实现这个目标:

更优雅的解决方案:使用一个叫做 TicketProfile 的类,它和 Ticket 有一对一的关系,并把 Client 的外键放进去。

比较 hacky 的解决方案:使用多对多的关系,然后手动编辑自动生成的表格,把 ticket_id 设置为唯一。

2

更黑科技的解决方案:在你定义完Client类之后,可以在模块级别的代码中做如下操作:

class Client(models.Model):
    ...

client = models.ForeignKey(Client, related_name='tickets')
client.contribute_to_class(Ticket, name='client')

我还没有完全测试过(没有进行实际的数据库迁移),但正确的描述符(Ticket用的是ReverseSingleRelatedObjectDescriptorClient用的是ForeignRelatedObjectsDescriptor)已经被添加到类中,South也能识别出新的字段。到目前为止,它的表现就像一个普通的ForeignKey一样。

编辑:其实并没有那么黑科技。这正是Django在不同类之间设置外键的方式。它只是通过在反向相关类构建时添加字段来反转这个过程。如果原始模型中的任何字段被遮蔽,它不会报错。只要确保你不要这样做,因为这可能会导致你的代码出问题。除此之外,我认为应该不会有其他问题。

撰写回答