19

Verileri depolamak için MongoDB ve MongoEngine kullanan bir Django uygulaması yapıyorum. Sorunumun basitleştirilmiş bir sürümünü sunmak için iki sınıfım olmasını istiyorum: Kullanıcı ve Sayfa. Her sayfa bir kullanıcı ve her kullanıcıyla bir sayfa ilişkilendirmelidir. MongoEngine'de İki Yönlü İlişkiler Uygulaması

from mongoengine import * 

class Page(Document): 
    pass 

class User(Document): 
    name = StringField() 
    page = ReferenceField(Page) 

class Page(Document): 
    content = StringField() 
    user = ReferenceField(User) 

(yani sayfayı unutmayın. Ben dairesel bağımlılıkları işlemek için Pythonictir yol Eksik varsa, bana bildirin. Kullanıcı daha önce tanımlanmış olmalıdır) Her doküman oluşturulur ve sadece iyi kurtardı ama bir bir Sayfayı atama olabilir Kullanıcı bir hata atar.
u = User(name='Jeff') 
u.save() 
p = Page(content="I'm a page!") 
p.save() 
p.user = u 
p.save() 
u.page = p 
u.save() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "build\bdist.win32\egg\mongoengine\document.py", line 71, in save 
    File "build\bdist.win32\egg\mongoengine\base.py", line 303, in validate 
mongoengine.base.ValidationError: Invalid value for field of type "ReferenceField" 

herkes bu istisnası atılır neden, yanlış yapıyorum ve bunu önlemek nasıl açıklayabilir misiniz?

from mongoengine import * 

class User(Document): 
    name = StringField() 
    page = ReferenceField('Page') 

class Page(Document): 
    content = StringField() 
    user = ReferenceField(User) 

Kullanım tek tırnak ('Sayfa') henüz tanımlanmamış sınıfları göstermek için:

+0

Gördüğünüz bir hata, yazar adında bir alan tanımladığınız ve kullanıcı adı verilen bir alanı ayarladığınızdır. Yayınlanan kod gerçekten kaçtırdınız mı? – Ian

+0

Evet, maalesef bu benim sorunumun kaynağı değildi. Bu hatayı yapmak benim nesnelere bir değişken ekleyecekti ama MongoEngine save() işlevini etkilemezdi. –

cevap

33

Bu doğru çözümdür.

8

Drew'in cevabı bu durumda en iyi yoldur, ama aynı zamanda bir GenereicReferenceField kullanabilirsiniz belirtmek istedim: tek tırnak içinde sınıf adı ile gitmek, Özgül sorun, yine

from mongoengine import * 

class User(Document): 
    name = StringField() 
    page = GenericReferenceField() 

class Page(Document): 
    content = StringField() 
    user = ReferenceField(User) 

Ama .

İlgili konular