如何在Django中将外部应用模型添加多个一的关系
我的Django项目使用了django-helpdesk这个应用。
这个应用里面有一个叫做Ticket
的模型。
我的应用里有一个Client
模型,它应该和Ticket
模型有一个一对多的关系,这样我就可以列出所有与特定客户相关的票据。
通常我会在Ticket
模型里加上models.ForeignKey(Client)
,这样就能建立这种关系。但是因为这是一个外部应用,我不想去修改它(这样将来更新的时候可能会有问题)。
我对ManyToMany
或者OneToOne
关系没有问题,但我不知道怎么实现ManyToOne
关系,也就是如何让外部应用的多个票据关联到我应用里的一个客户。
2 个回答
有(至少)两种方法可以实现这个目标:
更优雅的解决方案:使用一个叫做 TicketProfile
的类,它和 Ticket
有一对一的关系,并把 Client
的外键放进去。
比较 hacky 的解决方案:使用多对多的关系,然后手动编辑自动生成的表格,把 ticket_id
设置为唯一。
更黑科技的解决方案:在你定义完Client
类之后,可以在模块级别的代码中做如下操作:
class Client(models.Model):
...
client = models.ForeignKey(Client, related_name='tickets')
client.contribute_to_class(Ticket, name='client')
我还没有完全测试过(没有进行实际的数据库迁移),但正确的描述符(Ticket
用的是ReverseSingleRelatedObjectDescriptor
,Client
用的是ForeignRelatedObjectsDescriptor
)已经被添加到类中,South也能识别出新的字段。到目前为止,它的表现就像一个普通的ForeignKey
一样。
编辑:其实并没有那么黑科技。这正是Django在不同类之间设置外键的方式。它只是通过在反向相关类构建时添加字段来反转这个过程。如果原始模型中的任何字段被遮蔽,它不会报错。只要确保你不要这样做,因为这可能会导致你的代码出问题。除此之外,我认为应该不会有其他问题。