Python Django可重用应用程序与链接FK?

Python Django可重用应用程序与链接FK?,python,django,Python,Django,我有下面的场景 我有一个名为“Contacts”的现有应用程序,它的型号为number和name 我想创建一个名为“unsubscribe”的新应用程序,并使其可重用 这是我的问题: 在名为unsubscribe的新应用程序中,其型号将需要一个与联系人号码相关的外键。这意味着它现在与“联系人”绑定,我不能将其用于我的电子邮件应用程序Django如何从可重用的角度处理此问题?您可以利用并创建从退订模式到联系人模式的关系。这允许您抽象取消订阅与其他对象之间的关系,将它们连接到项目中模型的任何实例 普

我有下面的场景

我有一个名为“Contacts”的现有应用程序,它的型号为numbername

我想创建一个名为“unsubscribe”的新应用程序,并使其可重用

这是我的问题:

在名为unsubscribe的新应用程序中,其型号将需要一个与联系人号码相关的外键。这意味着它现在与“联系人”绑定,我不能将其用于我的电子邮件应用程序Django如何从可重用的角度处理此问题?

您可以利用并创建从退订模式到联系人模式的关系。这允许您抽象取消订阅与其他对象之间的关系,将它们连接到项目中模型的任何实例

普通ForeignKey只能“指向”另一个模型,这意味着如果TaggedItem模型使用ForeignKey,则必须选择一个且仅一个模型来存储标记。contenttypes应用程序提供了一个特殊的字段类型(GenericForeignKey),它可以解决这个问题,并允许与任何模型建立关系


通常,在应用程序之间导入模型是可以的。这只会产生一种依赖性,许多应用程序都有这种依赖性。当然,让你的应用程序可以独立插拔更为灵活,但重要的是,你要记录任何试图使用你的应用程序的人的依赖关系

<>如果你真的希望你的应用程序是可插拔的,考虑重新组织你的应用程序。简单是好的,但是过分坚持严格的、字面上的原则可能会妨碍功能

(没有你的应用程序的具体细节,这只是猜测,但由于你描述的所有应用程序都围绕着联系人,似乎它们可以简单地重新打包到同一个应用程序中,在联系人中使用unsubscribe作为布尔字段,并查看以设置属性。根据你对电子邮件的具体操作,类似的事情也会发生。)

from django.db import models
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic

class Unsubscription(models.Model):
    name = ...

    # These two fields allow you to manage the model & instance of object that 
    # this unsubscribe model instance is related to
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    # This gives you an easy way to get access to the actual instance of the 
    # instance above
    content_object = generic.GenericForeignKey('content_type', 'object_id')


# On the reverse end of the relationship you can add a Generic relation to 
# easily get access to all unsubscriptions related to this contact via the GFK
from myapp.models import Unsubscription
class Contact(models.Model):
    name = ...

    unsubscribtions = generic.GenericRelation(Unsubscribtion)