Django related_name在多个关系的情况下命名最佳实践

时间:2016-11-25 18:22:52

标签: django

经过一年的Django经历后,我发现我不太确定我是否正确使用Django related_names

想象一下,我有三个模型

classA(models.Model):
    pass
classB(models.Model):
    pass
classC(models.Model):
    modelA = models.ForeignKey(classA)
    modelB = models.ForeignKey(classB)

精细。现在我正在考虑将related_name添加到classC的modelA和modelB中,但令人沮丧的想法是我不能在两个字段中使用相同的名称。换句话说,这段代码显然是错误的

 classC(models.Model):
            modelA = models.ForeignKey(classA, related_name = 'classC') # wrong
            modelB = models.ForeignKey(classB, related_name = 'classC') # wrong

另一方面,提出这样的方法:

classC(models.Model):
        modelA = models.ForeignKey(classA, related_name = 'classA') # wrong
        modelB = models.ForeignKey(classB, related_name = 'classB') # wrong

会导致非常误导(至少对我来说)代码。考虑一下:

obj = classA.filter(classC__in = classA_qs)

因此,此类命名会导致代码classC = classA_instance非常具有破坏性。

命名related_name时的最佳做法是什么?关于ManyToManyFields有什么我想念的吗?实际上,我有一个大型项目,但我从未使用过ManyToManyFields,总是在示例中使用类似classC的第三个表。有什么我想念的吗?

1 个答案:

答案 0 :(得分:3)

如何使用变量related_names,你可以根据他们的应用和类来关联它们。

class ClassB(models.Model):
    readers = ForeignKey('Reader',
            related_name='readable_%(app_label)s_%(class)s_set+')