【问题标题】:Best practice for accessing distantly related Django models访问远相关的 Django 模型的最佳实践
【发布时间】:2012-11-23 15:29:33
【问题描述】:

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

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

【问题讨论】:

    标签: python django django-models coding-style standards


    【解决方案1】:

    使用属性

    我目前的方法是在Ten 模型中添加一个property,抽象掉那个属性链:

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

    【讨论】:

    • 你需要为每个嵌套关系定义一个属性方法,代码很多,一定是更好的方法
    • @PepperoniPizza 是的。我不想使我的答案复杂化,但是是的,这就是我目前正在做的事情。有点烦人。
    • 我觉得这种方法非常好,因为我看不到任何需要链接 5 个或更多模型的情况。
    【解决方案2】:

    您可能希望将 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')
    

    【讨论】:

    • 我不确定我是否完全遵循这一点。这是否允许使用ten_instance.one?因为这就是目标。
    • 我只是说,我认为访问远相关的 Django 模型的最佳实践是通过在抽象基础模型上创建一个 ForeignKey to self 来使用简单的层次结构。
    猜你喜欢
    • 2014-07-05
    • 2014-02-07
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多