我刚刚完成了第二次使用Django教程,现在我已经更加清楚地理解了这些内容.但是,我仍然不清楚网站内的应用程序如何互相交互.
例如,假设我正在编写一个博客应用程序(显然是一个相当受欢迎的活动).博客文章和评论倾向于一起,但它们足够明显,应该将它们构建到单独的应用程序中,这是Djano开发的一般理念.
请考虑以下示例.实际上我实际上并不会自己编写评论应用程序,因为网上已经存在好的代码,但这是为了演示/练习目的:
mysite的/博客/ models.py
from django.db import models class post(models.Model): title = models.CharField(max_length=200) author = models.CharField(max_length=200) content = models.TextField()
mysite的/评论/ models.py
from django.db import models from mysite.blog.models import post class comment(models.Model): id = models.AutoField() post = models.ForeignKey(post) author = models.CharField(max_length=200) text = models.TextField()
我上面写的是,从另一个应用程序导入模型并将其设置为外键,Django应用程序如何交互?或者是否有一个不同/更好的方法来构成一个网站进行交互?
更新
根据一个响应中的建议,我正在阅读contrib.contenttypes的文档.如果我正确读到这个,我可以像这样重写我的示例评论应用:
from django.db import models from django.contrib.contenttypes.models import ContentType from django.contrib.contentypes import generic class comment(models.Model): id = models.AutoField() author = models.CharField(max_length=200) text = models.TextField() content_type = models.ForeignKey(ContentType) content_object = generic.GenericForeignKey(content_type, id)
这是正确的吗?
看看django的内置contenttypes框架:
django.contrib.contenttypes
它允许您将应用程序开发为独立单元.这就是django开发人员用来允许django的内置注释框架将注释附加到项目中的任何模型的内容.
例如,如果您要将某个内容对象"附加"到不同类型的其他内容对象,例如允许每个用户在博客帖子,图像或用户个人资料上留下"最喜欢的"星标,则可以创建Favorite
具有通用关系字段的模型如下:
from django.db import models from django.contrib.auth.models import User from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic class Favorite(models.Model): user = models.ForeignKey(User) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id')
通过这种方式,您可以将Favorite
任何用户的星形添加到项目中的任何模型.如果要通过收件人模型类添加API访问权限,可以在收件人模型上添加反向通用关系字段(尽管这会"耦合"两个模型,您说要避免),或者执行查找通过Favorite
带有content_type
和object_id
接收者实例的模型,请参阅官方文档以获取示例.