1
class Student(db.Model):
    teacher = db.ReferenceProperty(Teacher, collection_name='students')
    name = db.StringProperty(required=True)
    zip_code = db.IntegerProperty(required=True)
    square_footage = db.IntegerProperty(required=True)
    month_entries = db.IntegerProperty(required=True)  

class Bill(db.Model):
    student = db.ReferenceProperty(Student, collection_name='bills')
    bill_month = db.DateProperty(required=True)
    energy = db.IntegerProperty(required=True)

上記のモデルのセットアップから...次のようなものを使用して、保存されているすべての請求書を簡単に表示できます。

bill = models.Bill.all()
for stubs in bill:
    print stubs.energy
    print stubs.student.name

しかし、各学生が持っている請求書をどのようにリストするのですか? SQL では、次のように言います。

SELECT * FROM Bill WHERE Student.Name = Samuel

ReferenceProperty で指定された Bills を取得する方法がわかりません。GQL ではそれほど単純ではないようです。参照プロパティでクエリを実行するにはどうすればよいですか?

4

3 に答える 3

3

ReferenceProperty は、参照されたエンティティに自動クエリを作成します (指定した場合は collection_name を使用します)。

sams_bills = Student.all().filter("name =", "Samuel").get().bills

sams_bills請求書の db.Query になりました。これに対して .fetch() を呼び出して、1 つ以上の請求書を取得できます。

于 2011-02-21T18:32:34.010 に答える
1

SQL の経験がある人が App Engine を理解するのが最も難しいのは、多くの場合、必要な結果を得るために 2 つのクエリが必要になることです。

student = Student.all().filter('name =', 'Samuel').get()
bill = Bill.all().filter('student =', student.key()).get()

SQL の経験を持つ人が理解するのが 2 番目に難しいことは、GQL を使用する人がほとんどいないことです。;)

于 2011-02-21T18:31:46.880 に答える
0

Bill クラスの db.ReferenceProperty "student" の collection_name パラメータは、すでにクエリを設定しています。だからあなたがしなければならないのはこれだけです:

student = Student.all().filter('name =', 'Samuel').get()
for bill in student.bills:
    logging.info('Student %s Month:%s Energy:%d' % (student.name, str(bill.bill_month), bill.energy)

現在、後方参照クエリによって返される結果は順不同です。(インデックスが正しく設定されている場合) .order() を使用して特定の順序でそれらを返すか、これらを Set に入れてメモリ内で (非常に高速に) 次のように並べ替えることができます。

sorted_bills = []
for bill in student.bills:
    sorted_bills.append(bill)

# Sort additions by month then by amount (secondary key sorts first in code)
sorted_bills = sorted(sorted_bills, key=lambda Bill: Bill.energy, reverse=True)
sorted_bills = sorted(sorted_bills, key=lambda Bill: Bill.bill_month, reverse=False)

この例では、学生が同じ bill_month 値を持つ複数の請求書を持っている場合、最大の請求書が最初に並べ替えられます (reverse=True パラメーターに注意してください)。

于 2011-04-04T06:10:45.397 に答える