访问远程相关的Django模型的最佳实践

时间:2012-11-23 15:29:33

标签: 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实例。这可能导致如下所示的长链属性链接:

ten_instance.nine.eight.seven.six.five.four.three.two.one

我想知道这个琐碎问题的标准方法是什么。我们是否保持原样,具有内在的描述性和可读性。或者我们的目标是缩短这样一条线以使事情变得更简单:

ten_instance.one

但这里最好的做法是什么?或者是否有更简单的解决方案?

2 个答案:

答案 0 :(得分:2)

使用属性

我目前的方法是向property模型添加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模型有关系?如果不亲自检查模型,我就无法判断。

答案 1 :(得分:0)

您可能希望将django-mptt用于复杂的层级模型,尽管它可能有点ott。如果您想要一个简单的层次结构,那么将ForeignKey添加到self:

class Number(models.Model):
    parent = models.ForeignKey('self', blank=True, null=True,
        related_name='child')

然后查询将基于一个唯一的字段,例如slug:

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