Python 练习调用内部函数

Python 练习调用内部函数,python,django,django-models,Python,Django,Django Models,我与表有父/子关系。看起来像这样 class Person(models.Model): Name = models.CharField() class ParentChild(models.Model): child = models.ForeignKey('Person', related_name='child') parent = models.ForeignKey('Person', related_name='parent') validfrom =

我与表有父/子关系。看起来像这样

class Person(models.Model):
    Name = models.CharField()

class ParentChild(models.Model):
    child = models.ForeignKey('Person', related_name='child')
    parent = models.ForeignKey('Person', related_name='parent')
    validfrom = models.DateTimeField(blank=True, null=True)
    validto = models.DateTimeField(blank=True, null=True)
我试图查询整个树并创建一个json发送到模板。 因此,对于每个人,我想使用一个函数来查询孩子,对于每个孩子,使用相同的函数来查询孩子是否有孩子

这就是我的函数

def getChildren(parentID):
    try:
        children = Person.objects.filter(parent=parentID)

        addJson = 'children: ['

        for a in children:
            addJson = addJson + '{text: { name: "Child '+str(a.id)+'" }},'
            addJson = getChildren(str(a.id))

        return addJson
    except:        
        return addJson
这只给了我一个孩子,再也没有了。所以我猜不可能调用自身,或者函数必须在再次调用之前完成


我现在很困。欢迎提出意见

我解决了这个问题。我没有注意到这个查询是针对错误表中的PK的

def getChildren(parentID, jsonData):
    try:
        qChildren = ParentChild.objects.filter(parent=parentID).values('child')

        addJson = jsonData + 'children: ['

        for a in qChildren:
            addJson = addJson + '{text: { name: "Child ' + str(a['child']) + '" }},'
            addJson = getChildren(str(a['child']), addJson)
        addJson = addJson + ']'
        return addJson
    except:
        return None

我解决了这个问题。我没有注意到这个查询是针对错误表中的PK的

def getChildren(parentID, jsonData):
    try:
        qChildren = ParentChild.objects.filter(parent=parentID).values('child')

        addJson = jsonData + 'children: ['

        for a in qChildren:
            addJson = addJson + '{text: { name: "Child ' + str(a['child']) + '" }},'
            addJson = getChildren(str(a['child']), addJson)
        addJson = addJson + ']'
        return addJson
    except:
        return None

但实际上,对于一个树结构,你应该使用这样的东西,这样会更有效率。但当父/子关系设置为一个时间框架时,现在似乎无法实现。我只发现,如果树是固定的,mptt是有用的。对我来说,关系会改变,我需要保持关系的历史。你的猜测是函数不可能调用它自己是不正确的。这是完全有可能的。因此,问题在于你的代码,而不是任何假定的无法进行递归调用。但实际上,对于一个树结构,你应该使用这样的东西,这样会更有效率。@DanielRoseman我在其他事情中也使用过它。但当父/子关系设置为一个时间框架时,现在似乎无法实现。我只发现,如果树是固定的,mptt是有用的。对我来说,关系会改变,我需要保持关系的历史。你的猜测是函数不可能调用它自己是不正确的。这是完全有可能的。因此,问题在于您的代码,而不是假定无法进行递归调用。