0

以下信息来自 web2py book 的第 270 页:

person = db.person(id)

for dog in person.dog.select(orderby=db.dog.name):
    print person.name, 'owns', dog.name

在这最后一个表达式person.dog中是一个快捷方式

db(db.dog.owner==person.id)

现在:

这本书没有引用person定义表的部分,我不相信该表的任何先前定义实际上有一个dog列。如果 person 表确实有一个dog列,那就没有意义了,因为大概一个人可以有很多条狗。

那么他们是说从dog表到人的引用以某种方式自动创建了从人到的前向引用dog,而没有任何明确的列person

4

1 回答 1

1

“人”数据库​​表本身没有自动创建任何内容。相反,表示给定人员记录的 DAL Row 对象包括一个 DAL Set 对象,该对象表示“dog”表中引用该人员的记录集。在代码中,person是一个 Row 对象(即db.person(id))——它有一个“dog”属性,就是下面的 DAL Set 对象:

db(db.dog.owner == person.id)

这是引用此 person.id 的一组狗。如果你这样做:

>>> print db.person(1)

你会看到类似的东西:

<Row {'name': 'John', 'update_record': <function <lambda> at 0x2b08758>,
'dog': <gluon.dal.Set object at 0x2b00d10>, 'id': 1,
'delete_record': <function <lambda> at 0x2b08b90>}>

因此,除了包含记录的“name”和“id”值之外,Row 对象还包括表示引用此人的“dog”表记录的 Set 对象update_record()和函数。delete_record()如果您打印与该 Set 对象关联的查询,您将获得以下信息:

>>> print db.person(1).dog.query
(dog.owner = 1)

因此,前向引用是在 Row 对象本身中创建的。请注意,该db.person(1).dog属性只是一个定义查询的 Set 对象——它不包含实际的“狗”表记录,甚至不包含对其 id 的引用。在您调用select()方法 via之前,不会对数据库进行任何查询db.person(1).dog.select(),这将返回“dogs”表中的实际记录。

于 2012-08-03T20:37:13.433 回答