我有以下情况。
我有一个名为“通讯录”的现有应用程序,其模型我有数字和名称。
我想创建一个名为“取消订阅”的新应用,我希望将其设为可重复使用。
这是我的问题:
在名为unsubscribe的新应用中,它的模型需要与联系号码建立外键关系。现在这意味着它现在与“联系人”绑定,我不能用它来说我的电子邮件应用程序。 Django如何从可重用的角度处理这个问题?
答案 0 :(得分:1)
您可以使用Generic Relations并创建从取消订阅模型到联系人模型的Generic Foreign Key关系。这允许您抽象取消订阅和其他对象之间的关系,将它们连接到项目中任何模型的实例。
普通的ForeignKey只能“指向”另一个模型,这意味着如果TaggedItem模型使用了ForeignKey,则必须选择一个且只有一个模型来存储标签。 contenttypes应用程序提供了一个特殊的字段类型(GenericForeignKey),它可以解决这个问题,并允许关系与任何模型相关
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)
答案 1 :(得分:1)
通常可以在应用之间导入模型。这只会创建一个依赖项,许多应用程序都有。当然,让您的应用程序可以独立插件更灵活,但重要的是您记录任何试图使用您的应用程序的人的依赖关系。
如果您真的希望自己的应用可插拔,请考虑重新组织您的应用。简单是好的,但过分坚持并坚持严格遵守原则可能妨碍功能。
(如果没有应用程序的具体细节,这只是推测,但由于您描述的所有应用程序都围绕着联系人,似乎可以简单地将它们重新打包到同一个应用程序中,并取消订阅联系人中的布尔字段并查看设置属性。取决于你想用电子邮件做什么,类似的东西)