在我的模型中,我有兩個相關的表,如下所示:
from google.appengine.ext import ndb
class Parent(ndb.Model):
name = ndb.StringProperty()
class Child(ndb.Model):
parent = ndb.KeyProperty(kind=Parent, indexed=True)
name = ndb.StringProperty()
我想查詢Child表并按父名(升序或降序)對子記錄進行排序,如何使用NDB ORM執行此操作?
我盡可能不希望這個程序在 Python 的幫助下在代碼級別完成。
uj5u.com熱心網友回復:
一般來說@gaefan 是正確的,你不能正確地做到這一點。
我只能看到 3 種方法來完成這項作業。
父名稱也必須是父的鍵,然后您可以訂購
Child.query().order(Child.parent).fetch(). 缺點是更改父母的姓名是不可能的。您必須更改所有子模型和其他具有外鍵的模型上的鍵和所有外鍵將父名稱非規范化為 Child 上的欄位,如下所示:
class Child(ndb.Model): parent = ndb.KeyProperty(kind=Parent, indexed=True) name = ndb.StringProperty() parent_name = ndb.StringProperty()
那你就可以了Child.query().order(Child.parent_name).fetch()。不利的一面是,如果您想更改 Parent.name,則必須更新它的所有子項。
- 如果這是用于諸如 http 處理程式之類的東西,并且您需要回傳包含 10 個結果或其他內容的頁面,則您可以先獲取按名稱排序的 10 個父項,然后對所有擁有其中一個父項的子項運行查詢
Child.query(namespace="test").filter(Child.parent.IN(order_parent_keys)).fetch()(這就是您在您的評論中建議)。然后,您必須在事后按父母姓名對孩子進行排序。這種方法的問題是,這一次僅適用于有限數量的父母(我忘記了您可以傳遞多少個值.IN())。當原始組的孩子用完order_parent_keys并且需要獲得下一組時,分頁也會變得奇怪。
適合您的解決方案實際上取決于您的資料。你有多少父母,你希望每個父母有多少孩子。此外,您嘗試處理的資料量以及處理資料的速度。
例如,如果您需要每天處理一次您的全部或大部分資料庫,Google Dataflow 將是完美的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/377932.html
