了解PeeWee的related_name属性

时间:2014-11-17 15:28:51

标签: orm peewee

我真的很享受Peewee ORM。它重量轻,易于使用,并且记录良好。我抓到的一件事是实现外键时使用的related_name属性。我永远不确定该属性是否应与表格或列相关。有人可以向我解释我应该使用的名称,以及如何使用?例如,使用Peeewee文档中的学生/课程示例。

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专栏的相关名称是什么?

1 个答案:

答案 0 :(得分:7)

  

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

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

  • Tweet对发送它的用户有一个外键。后引用是用户创建的推文,因此related_name='tweets'
  • 类别具有指向父类别的外键。反向引用是给定父级的子类别,因此related_name='children'
  • 代码段具有其所写语言的外键。反向引用是一种语言的代码段,因此related_name='snippets'
  

例如,使用Peeewee文档中的学生/课程示例。

这是多对多的,因此后引用不是那么“清晰”,因为外键存在于联结表上。您的引用框架是联结表,因此在两种情况下反向引用都是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')