Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django模型:对象是另一个对象的后代吗?_Django_Postgresql_Django Models - Fatal编程技术网

Django模型:对象是另一个对象的后代吗?

Django模型:对象是另一个对象的后代吗?,django,postgresql,django-models,Django,Postgresql,Django Models,我有一个模特类别。类别可以有一个超类别和多个子类别,如树结构。它们都是类别对象 我试图创建一个方法,告诉我self是否是给定类别的后代。现在,它可以说它是不是一个孩子,但我也想检测孙子、孙女等等 你知道怎么做吗?有什么内置的工具吗 class Category(models.Model): name = models.CharField(max_length=1000) url = models.URLField(max_length=1000) supercategor

我有一个模特类别。类别可以有一个超类别和多个子类别,如树结构。它们都是类别对象

我试图创建一个方法,告诉我self是否是给定类别的后代。现在,它可以说它是不是一个孩子,但我也想检测孙子、孙女等等

你知道怎么做吗?有什么内置的工具吗

class Category(models.Model):
    name = models.CharField(max_length=1000)
    url = models.URLField(max_length=1000)
    supercategory = models.ForeignKey('Category',null=True,blank=True)

    def is_subcategory(self,category):
        if self.supercategory == category:
             return True

    def __unicode__(self):
        return self.name

可以使用递归实现这一点。 递归是编程中的一个普遍概念,基本上是函数调用自身时的递归

在这里,您可以执行以下操作:

def is_subcategory(self,category):
    if self.supercategory is None:
         return false
    return (self.supercategory == category or 
            self.supercategory.is_subcategory(category))

这样做的危险之处在于,如果类别中存在循环,则会有无限个堆栈调用。

哦,谢谢,我没有想到递归。很好的解决方案。对于这样的结构,您应该使用。