递归收集PythonDjango中的子项

递归收集PythonDjango中的子项,第1张

概述我有一个这样的模型....class Person(models.Model): name = models.CharField(max_length=55,null=False, blank=False) parent = models.ForeignKey('Person.Person', null=False, blank=False)

我有一个这样的模型….

class Person(models.Model):    name = models.CharFIEld(max_length=55,null=False,blank=False)    parent = models.ForeignKey('Person.Person',blank=False)

我想创建一个递归函数,最终将返回整个人家谱的字典….

所以例如……

first_person = Person.objects.filter(name='FirstPerson')family_tree = GetChildren(first_person)

GetChildren是我的递归函数,它将不断调用GetChildren,直到没有更多的子项……它应该返回一个包含所有这些子项的字典,如此…

{    'name': 'FirstPerson','children': [        {            'name': 'FirstPersonChild1'            'children': [ ... ]        },{            'name': 'FirstPersonChild2'            'children': [ ... ]        }    ]}

我从来没有善于递归,有人会介意如何解决这个问题……最佳答案这种实现应该有效

def get_family_tree(person):    """ return a family tree for a Person object """    children = person.children.all()    if not children:        # this person has no children,recursion ends here        return {'name': person.name,'children': []}    # this person has children,get every child's family tree    return {        'name': person.name,'children': [get_family_tree(child) for child in children],}

请注意,这将占用与人员一样多的数据库调用.如果遇到性能问题,可以尝试将所有数据提取到内存中.

关于递归的思考

考虑递归的一种方法是从基本情况开始 – 即递归结束的地方.在您的情况下,我们知道如果一个人没有孩子,家谱如何:

{    'name': 'FirstPerson','children': [],}

在有了基本案例之后,考虑一下你必须执行递归的问题.

在你的情况下,这将是有孩子的父母,但没有大孩子.我们知道每个孩子的家谱应该如何看 – 这只是基本情况!这引出了我们返回父级名称的解决方案,以及每个孩子的家谱的列表.导致类似于:

{    'name': FirstPerson,'children': [

编辑

Django自动为ForeignKey生成反向关系.

class Person(models.Model):    ....    parent = models.ForeignKey('self',related_name='children',blank=True,null=True)p = Person()p.children.all() # automatically fetch all Person objects where parent=p

见https://docs.djangoproject.com/en/1.9/ref/models/fields/#foreignkey 总结

以上是内存溢出为你收集整理的递归收集Python / Django中的子项全部内容,希望文章能够帮你解决递归收集Python / Django中的子项所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1206394.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)