1

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

 但是这里的最佳实践是什么?还是有更简单的解决方案?

4

2 回答 2

2

使用属性

我目前的方法是propertyTen模型中添加一个,抽象出该属性链:

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?如果不亲自检查模型,我将无法判断。

于 2012-11-23T15:29:33.220 回答
0

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

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

那么查询将是这样的,基于一个唯一的字段,比如 slug:

Number.objects.get(parent__slug='one')
于 2012-11-23T18:19:28.423 回答