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列があったとしても意味がありません。おそらく、1 人が多くの犬を飼っている可能性があるからです。

dogつまり、テーブルから人への参照が、人から人への前方参照を自動的に作成し、dog明示的な列が存在しないと彼らは言っているのpersonでしょうか?

4

1 に答える 1

1

"person" データベース テーブル自体には何も自動的に作成されませんでした。むしろ、特定の人物のレコードを表す DAL Row オブジェクトには、その人物を参照する「犬」テーブル内のレコードのセットを表す DAL Set オブジェクトが含まれます。コードで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 への参照は含まれていません。「dogs」テーブルから実際のレコードを返すselect()を介してメソッドを呼び出すまで、データベースに対してクエリは実行されません。db.person(1).dog.select()

于 2012-08-03T20:37:13.433 に答える