了解PeeWee的related_name属性

com*_*ted 2 orm peewee

我真的很享受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)
Run Code Online (Sandbox Code Playgroud)

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

col*_*fer 7

我永远不确定该属性是否应该与表或列相关.有人可以向我解释我应该使用的名称,以及如何使用?

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

  • 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')
Run Code Online (Sandbox Code Playgroud)