如何在可重用的Django应用程序中建模外键?

Apr*_*che 14 python django django-models

在我的django网站中,我有两个应用程序,博客和链接.博客有博客模型,链接有模型链接.这两件事之间应该有一对多的关系.每个博客帖子有很多链接,但每个链接只有一篇博文.简单的答案是在链接模型中将ForeignKey放到blogpost中.

这一切都很好,但有一个问题.我想让链接应用程序可重用.我不希望它依赖于博客应用程序.我希望能够在其他网站中再次使用它,并可能将链接与其他非博客应用和模型相关联.

一般的外键似乎可能是答案,但不是真的.我不希望链接能够与我的网站中的任何模型相关联.只是我明确指定的那个.我从之前的经验中知道,在数据库使用方面可能存在使用通用外键的问题,因为您无法像使用常规外键那样对通用外键执行select_related.

建立这种关系的"正确"方法是什么?

Van*_*ale 23

如果您认为链接应用程序将始终指向单个应用程序,那么一种方法是将外部模型的名称作为包含应用程序标签的字符串而不是类引用(Django docs说明)传递.

换句话说,而不是:

class Link(models.Model):
    blog_post = models.ForeignKey(BlogPost)
Run Code Online (Sandbox Code Playgroud)

做:

from django.conf import setings
class Link(models.Model):
    link_model = models.ForeignKey(settings.LINK_MODEL)
Run Code Online (Sandbox Code Playgroud)

并在您的settings.py中:

LINK_MODEL = 'someproject.somemodel'
Run Code Online (Sandbox Code Playgroud)