Python 访问远亲Django模型的最佳实践
假设我们有一长串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
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。