假设我们有一长串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
答案 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')