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

Edg*_*yan 5 django

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

想象一下我有三个模型

classA(models.Model):
    pass
classB(models.Model):
    pass
classC(models.Model):
    modelA = models.ForeignKey(classA)
    modelB = models.ForeignKey(classB)
Run Code Online (Sandbox Code Playgroud)

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

 classC(models.Model):
            modelA = models.ForeignKey(classA, related_name = 'classC') # wrong
            modelB = models.ForeignKey(classB, related_name = 'classC') # wrong
Run Code Online (Sandbox Code Playgroud)

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

classC(models.Model):
        modelA = models.ForeignKey(classA, related_name = 'classA') # wrong
        modelB = models.ForeignKey(classB, related_name = 'classB') # wrong
Run Code Online (Sandbox Code Playgroud)

会导致一个非常具有误导性(至少对我而言)的代码。考虑一下:

obj = classA.filter(classC__in = classA_qs)
Run Code Online (Sandbox Code Playgroud)

所以这样的命名会导致非常具有破坏性的代码classC = classA_instance

在命名related_names方面的最佳实践是什么。我对 ManyToManyFields 有什么遗漏吗?实际上,我有一个大项目,但我从来没有使用过 ManyToManyFields,在示例中总是使用第三个表,如 classC。有什么我想念的吗?

Gus*_*yes 4

如何使用变量 related_names 这样您就可以根据它们的应用程序和类将它们关联起来。

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