如何在Django自外键中检索完整的树数据?

如何在Django自外键中检索完整的树数据?,django,django-models,django-rest-framework,django-views,Django,Django Models,Django Rest Framework,Django Views,我插入3条记录 Electronics Null Mobile 1 Iphone 2 class Category(models.Model): name = models.CharField(max_length=160) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True) 如果我搜索Iphone,如何获取所有相关数据 例如: Category.object.

我插入3条记录

Electronics Null
Mobile 1
Iphone 2

class Category(models.Model):
    name = models.CharField(max_length=160)
    parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
如果我搜索Iphone,如何获取所有相关数据

例如:

Category.object.filter(name='Iphone')
结果需要所有父数据 例:


您可以在类别模型上使用递归函数

def get_parents(self, parents=None):
  if not parents:
    parents = []
  if self.parent:
    parents.append(self.parent)
    return get_parents(self.parent, parents)
  else:
    return parents

iphone = Category.objects.get(name='Iphone')
parents = iphone.get_parents()

要最小化数据库查询,您需要使模型现代化

  • 改变模式
  • 获得祖先
def get_parents(self, parents=None):
  if not parents:
    parents = []
  if self.parent:
    parents.append(self.parent)
    return get_parents(self.parent, parents)
  else:
    return parents

iphone = Category.objects.get(name='Iphone')
parents = iphone.get_parents()
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey

class Category(MPTTModel):
    name = models.CharField(max_length=160)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

    class MPTTMeta:
        order_insertion_by = ['name']
from .models import Category

Category.object.filter(name='Iphone').get_ancestors(include_self=True)