gpt4 book ai didi

django - 为分层模型创建高效的数据库查询 (django)

转载 作者:行者123 更新时间:2023-12-05 00:04:31 33 4
gpt4 key购买 nike

考虑这个(django)模型:

class Source(models.Model):
# Some other fields
type = models.ForeignKey('Type')

class Type(models.Model):
# Some other fields
parent = models.ForeignKey('self')

该模型本身有一个外键,因此创建了一个层次结构。

假设我们有以下层次结构:
Website
Blog
News
Social Network
Q&A
Forum
Radio
Government radio
Pirate radio
Commercial radio
Internet radio

如果我选择 Source,我如何有效地查询来自 Type ,我也检索到Sources其中有一个 Type那是给定类型的 child 吗?

我试过遍历整棵树,但这显然不是很有效。

另一种选择是使用 ManyToManyField 并通过覆盖 save() 方法自动附加父类型。例如,如果选择了“博客”,则还会创建“网站”的记录。但这对我来说似乎太过分了。

最佳答案

django-mptt 或 django-treebeard 是分层数据的好 helper 。它们都为您的模型添加了额外的元数据,以实现高效查询。

如果您选择使用 django-treebeard,您的模型可能如下所示:

from django.db import models
from treebeard.mp_tree import MP_Node

class Source(models.Model):
# Some other fields
type = models.ForeignKey('Type')

class Type(MP_Node):
# Some other fields
name = models.CharField(max_length=100)

# parent gets added automatically by treebeard
# parent = models.ForeignKey('self', blank=True, null=True)

并且可以这样查询:
# get all Sources of Type type and descendants of type
type = Type.objects.get(name='Radio')
Source.objects.filter(type__in=type.get_descendants())

https://django-treebeard.readthedocs.io/en/latest/api.html更多可能的查询

关于django - 为分层模型创建高效的数据库查询 (django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5653000/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com