2014-06-24 17 views
8

manyb ile çoktan çoğa ilişkisi modellemeye çalışıyorum. Bunu yapmanın iyi bir örneğini işaret eden var mı?Çoktan-Çok İlişkili ndb

class Person(ndb.Model): 
    guilds = ndb.KeyProperty(kind="Guild", repeated=True) 

class Guild(ndb.Model) 
    members = ndb.KeyProperty(kind="Person", repeated=True) 

    def add_person(self, person): 
     self.members.append(person.key) 
     self.put() 
     person.guilds.append(self.key) 
     person.put() 

bu konuda gitmek için doğru yolu mu: Burada başta

şu anda ne var bir örnektir? Etrafa iyi baktım ama konuyla ilgili iyi bir belge bulamıyorum.

Veri deposu görüntüleyicide, bu ilişkinin beklediğim Anahtarlar listesi olarak saklandığını görebiliyorum. Ancak

, böyle Kişi sınıfı yöntemlerinde bunları kullanmaya çalıştığınızda:

for guild in self.guilds: 

alıyorum: Bu konuda gitmek için doğru yol değildir

TypeError: 'KeyProperty' object is not iterable 
+0

'guild için self.guilds'de çalışmalıdır. Tekrarla 'True = True' ifadesini Kişiye koyarsanız againt'i kontrol edin: guilds = ndb.KeyProperty (kind = "Guild", tekrarlı = True) ' –

+0

Tekrarlanan özellikler ile elde edilebilecek ilişki sayısının üst sınırı olduğuna dikkat edin. . Binlerce veya daha fazla, çok sayıda ilişkiye ihtiyacınız varsa veya ilişkilere isim vermeniz gerekiyorsa, ilişkinin her bir ucunu işaret eden iki ana sayfanın bulunduğu bir ara varlık da çalışır, ancak genellikle daha az verimlidir ve Ek görünümlerden kaçınmak için özet görünümlere ihtiyacınız varsa, bu varlıktaki bazı yedek bilgileri saklamak için. –

cevap

12

sayılı.

Yalnızca bir tekrarlanan özelliğiyle bir çok-çok ilişki modelleyebilirsiniz: (

class Person(ndb.Model): 
    @property 
    def guilds(self): 
     return Guild.query().filter(Guild.members == self.key) 

class Guild(ndb.Model): 
    members = ndb.KeyProperty(kind="Person", repeated=True) 

    def add_person(self, person): 
     self.members.append(person.key) 
     self.put() 
ilişkinin yönü birçok faktöre bağlıdır

işinizi:

class Person(ndb.Model): 
    guilds = ndb.KeyProperty(kind="Guild", repeated=True) 

class Guild(ndb.Model): 
    @property 
    def members(self): 
     return Person.query().filter(Person.guilds == self.key) 

    def add_person(self, person): 
     person.guilds.append(self.key) 
     person.put() 

veya tam tersi ile model, kişi başına lonca sayısı, guild başına üye sayısı, vb.)

+0

Bu çok teşekkürler. Yine de neden aldığımı bilmiyorum: 'TypeError: 'KeyProperty' nesnesi aynı özellikte yinelenemez. Bu benim için çalışır, ancak tekrarlanan bir KeyProperty üst sınırının 5000 olduğunu düşünüyorum, bu yüzden daha fazla varlığa sahip kişiler için iyi olmayabilir. – chrisw

+0

Rica ederim. İlişkinin her iki tarafında çok fazla varlığınız varsa, ilişki için başka bir varlık oluşturmanız gerekir. Aynı şekilde, İlişkisel DB'de çoktan çoğa ilişkiler için yeni bir tablo yaratırsınız. Fakat unutmayın, veri deposu sorgularında birleştirme yapamazsınız. –

+0

Bu, kaçınmanız gereken bir şey. bu http://stackoverflow.com/questions/15377119/gae-ndb-design-performance-and-use-of-repeated-properties/15418435#15418435 – EsseTi