我真的很喜欢Peewee ORM。它轻巧,易于使用,并且有据可查。我难以理解的一件事是实现外键时使用的related_name属性。我永远不确定该属性应该与表还是与列相关。有人可以向我确切说明我应使用的名称,以及如何使用它吗?例如,在Peeewee文档本身中找到了Student / Courses示例。

https://peewee.readthedocs.org/en/2.0.2/peewee/fields.html#implementing-many-to-many

class Student(Model):
    name = CharField()

class Course(Model):
    name = CharField()

class StudentCourse(Model):
    student = ForeignKeyField(Student)
    course = ForeignKeyField(Course)


假设我有学生,课程,学生课程模型。 StudentCourse列的相关名称是什么?

最佳答案

我永远不确定该属性应该与表还是与列相关。有人可以向我确切说明我应使用的名称,以及如何使用它吗?


外键就像一个指针,一对一。但是也有一个隐式的反向引用-这是相关名称。例子:


Tweet对发推的用户具有外键。反向引用是用户创建的推文,因此related_name='tweets'
类别本身具有外键以指示父类别。后向引用是给定父级的子级,因此related_name='children'
代码段具有所写语言的外键。反向引用是该语言的代码段,因此related_name='snippets'



例如,在Peeewee文档本身中找到了Student / Courses示例。


这是多对多的,因此反向引用不是很“清晰”,因为外键存在于联结表上。您的参考框架是联结表,因此两种情况下的后向引用都为studentcourses,尽管这无济于事,因为后向引用只会将您带到联结表。因此,对于多对多而言,通常可以将后向引用保留为默认值,因为查询通常看起来像:

# get students in english 101
Student.select().join(StudentCourse).join(Course).where(Course.name == 'ENGL 101')

# get huey's courses
Course.select().join(StudentCourse).join(Student).where(Student.name == 'Baby Huey')

关于orm - 了解PeeWee的related_name属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26976059/

10-13 00:47