【问题标题】:How to add many to one relationship with model from external application in django如何在 django 中从外部应用程序中添加与模型的多对一关系
【发布时间】:2014-04-10 13:38:25
【问题描述】:

我的 django 项目使用 django-helpdesk 应用程序。 此应用有Ticket 型号。

我的应用程序有一个Client 模型,它应该与票证有一对多的关系——因此我可以例如列出有关特定客户的所有票证。

通常我会将models.ForeignKey(Client) 添加到Ticket 但它是一个外部应用程序,我不想修改它(未来更新问题等)。

我对@9​​87654326@ 或OneToOne 没有任何问题,但不知道如何使用ManyToOne(我的应用程序中的许多票从外部应用程序到一个客户)

【问题讨论】:

  • 使用一个辅助模型,它有一个 OneToOneClient 和一个 ManyToManyTicket
  • @elssar 他已经可以在ClientTicket 之间定义一个ManyToMany,在这种情况下不需要辅助类。我认为您的意思是一个助手类,它有一个 OneToOneTicket 和一个 OneToManyClient 的关系。
  • 相关问题:有没有办法在不修改helpdesk.views的情况下发布新票时创建TicketProfile,也许是自定义中间件?
  • @Lord_JABA 是的,您可以在必要时通过listen the post_save signal 创建TicketProfile

标签: python django foreign-key-relationship


【解决方案1】:

更 hacky 的解决方案:您可以在 Client 类之后在模块级代码中执行以下操作:

class Client(models.Model):
    ...

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

我还没有完全测试它(我没有进行任何实际的数据库迁移),但是正确的描述符(ReverseSingleRelatedObjectDescriptor 用于TicketForeignRelatedObjectsDescriptor 用于Client)被添加到类中,并且南承认新领域。到目前为止,它似乎就像普通的ForeignKey 一样工作。

编辑:实际上甚至没有那么老套。这正是 Django 跨类设置外键的方式。它只是通过在构建反向相关类时添加字段来反转过程。如果任一模型上的任何原始字段被遮蔽,它都不会引发错误。只要确保你不这样做,因为它可能会破坏你的代码。除此之外,我认为不应该有任何问题。

【讨论】:

    【解决方案2】:

    有(至少)两种方法来完成它:

    更优雅的解决方案:使用与Ticket 一对一关系的TicketProfile 类,并将Client 外键放入其中。

    Hacky 解决方案:使用多对多关系,并手动编辑自动创建的表并使ticket_id 唯一。

    【讨论】:

    • 如果TicketProfileTicketOneToOneClient 有M2M 关系,那么,通过一个对象,他可以将FKTicket 复制到Client,即多个票链接到一个客户。
    • 那么理论上你可以为同一张票创建两个独立的TicketProfiles,并将每一个链接到不同的Clients。您正在复制的实际上是 Client 和 Ticket 之间的 M2M 关系。
    • 啊!没想到。
    猜你喜欢
    • 2019-09-05
    • 2011-11-15
    • 2018-05-21
    • 1970-01-01
    • 2014-10-03
    • 2012-07-22
    • 2012-07-28
    • 1970-01-01
    • 2011-02-22
    相关资源
    最近更新 更多