Python 访问远亲Django模型的最佳实践

Python 访问远亲Django模型的最佳实践,python,django,django-models,coding-style,standards,Python,Django,Django Models,Coding Style,Standards,假设我们有一长串Django模型,每个模型都通过ForeignKey字段引用上述模型: class One(models.Model): # fields class Two(models.Model): one = models.ForeignKey(One) ... class Ten(models.Model): nine = models.ForeignKey(Nine) 好!!现在想象一下,如果你愿意的话,有一个Ten模型的实例,并且想要获取相关的One

假设我们有一长串Django模型,每个模型都通过
ForeignKey
字段引用上述模型:

class One(models.Model):
    # fields

class Two(models.Model):
    one = models.ForeignKey(One)

...

class Ten(models.Model):
    nine = models.ForeignKey(Nine)
好!!现在想象一下,如果你愿意的话,有一个
Ten
模型的实例,并且想要获取相关的
One
实例。这可能会导致长行属性链接,如下所示:

ten_instance.nine.eight.seven.six.five.four.three.two.one
我想知道对于这个琐碎的问题,标准的处理方法是什么。我们是否让它保持原样,具有内在的描述性和可读性。还是我们的目标是缩短这条线,让事情变得更简单:

ten_instance.one
但这里的最佳实践是什么?还是有更简单的解决方案?使用属性 我目前的方法是在
Ten
模型中添加
属性
,抽象掉属性链接:

class Ten(models.Model):
    nine = models.ForeignKey(Nine)

    @property
    def one(self):
        return self.nine.eight.seven.six.five.four.three.two.one

然而,我可以看到这种策略的一个缺点,那就是增加了神秘主义。
Ten
实例是否确实与
One
模型有关系?如果不亲自检查模型,我就无法判断。您可能希望对复杂的层次模型使用django mptt,尽管它可能有点过时。如果需要简单的层次结构,请向self添加ForeignKey:

class Number(models.Model):
    parent = models.ForeignKey('self', blank=True, null=True,
        related_name='child')
然后,基于一个唯一的字段,比如slug,查询会是这样的:

Number.objects.get(parent__slug='one')

您需要为每个嵌套关系定义一个属性方法,这需要大量代码,必须是一个更好的方法approach@PepperoniPizza是的。我不想让我的答案复杂化,但是的,这就是我目前正在做的。这有点烦人。我觉得这种方法很好,因为我看不到任何情况下我需要链接5个或更多的模型。我不确定我是否完全遵循这一点。这是否允许使用十个实例。一个?因为这就是目标。我只是说,我认为访问遥远相关的Django模型的最佳实践是使用简单的层次结构,在抽象的基础模型上创建一个ForeignKey给self。