django中的相关模型查询

Posted

技术标签:

【中文标题】django中的相关模型查询【英文标题】:related models queries in django 【发布时间】:2018-09-13 09:37:33 【问题描述】:

我有如下相互关联的树模型:

第一堂课有项目的基本信息。

class Project(models.Model):
    customer =  models.ForeignKey(
                                settings.AUTH_USER_MODEL,
                                on_delete = models.CASCADE,)
    title = models.CharField(max_length=200)
    pub_date = models.DateTimeField(default=timezone.now)

第二个类用于注册每个项目相关的类别。

class ProjectCategory(models.Model):
    project = models.ForeignKey(
                                Project,
                                on_delete = models.CASCADE)
    projectCategory = models.ForeignKey(
                                Category,
                                on_delete=models.CASCADE)

最后一个模型表示项目的位置。

class ProjectLocation(models.Model):
    project = models.ForeignKey(
                                Project,
                                on_delete = models.CASCADE)
    projectLocation = models.ForeignKey(
                                Location,
                                on_delete=models.CASCADE)

我试图在模板中呈现项目列表。 我想显示与每个项目相关的信息(类别和位置)。 怎么能做到呢? 使用查询 Project.objects.all() 不允许我访问“projectLocation”和“projectCategory”字段。

【问题讨论】:

您的项目模型没有这些字段。要访问相关模型,您必须将_set 添加到诸如projectLocation_set 之类的字段名称中。请记住,all() 返回的列表不仅仅是单个元素。 projectLocation 还是 projectlocation?我应该将 ProjectLocation 对象添加到视图的上下文中吗? 您在上下文中获得了主要对象,因此不需要,在模板执行期间将获取所有需要的数据,所以不需要,您不需要将相关对象添加到上下文中。更多信息:@987654321 @ 它是一种魅力。最后一个问题,调用 _set 是否会降低模板渲染速度? 很多?它始终取决于您使用的数据库和数据集的大小。但是我猜你现在不应该关心性能,所有性能升级都应该在出现性能问题时进行???? 【参考方案1】:

在您的外键字段中添加related_name,您可以通过此名称访问它们。

例如项目类别:

class ProjectCategory(models.Model):
    project = models.ForeignKey(Project, related_name='categories')

所以现在你可以这样做: project.categories.all()

【讨论】:

以上是关于django中的相关模型查询的主要内容,如果未能解决你的问题,请参考以下文章

两个相关模型的 Django 查询

Django - 查询:使用相关模型字段注释查询集

如何通过django中的多级反向外键获取相关对象查询集?

具有多个字段的模型中的查询集(Django)

django 查询模型 A 并从相关模型 B 中排除一些项目

Django模型层相关