2010-11-22 28 views
0

Aşağıdaki Django Model var - Django Modelleri Yabancı Anahtar Saha Maç

class M(models.Model): 
    ... 
    disp_name = models.CharField(max_length=256, db_index=True) 
    ... 

class XX(models.Model): 
    x = models.ForeignKey(User) 
    y = models.ForeignKey(M, unique=True) 

Şimdi benim views.py içinde, ben saha y.disp_name ile XX içindeki tüm öğeleri kısmi dize maç yapmak istiyorum.

Normalde kimse bu yapacağını - M.objects.filter(disp_name__istartswith='string')

Ama burada MModel XX bir ForeignKey olduğunu. Yani XX.objects.filter(y.disp_name__istartswith='string') yaparsam bir hata alıyorum. Ayrıca

, bu da başarısız - SyntaxError: keyword can't be an expression (<console>, line 1)

Bu nasıl yapmak için - Ben diyor olsun u = User.objects.get(id=1) u.xx_set.filter(y.disp_name__istartswith='string')

İstisna?

cevap

2

X, Y ve M yerine uygun alan adları kullansaydınız - takip etmesi gerçekten zor.

Ama her durumda, her zaman filtre ifadesi sol taraftaki ilişkilerini takip etmek çift alt çizgi sözdizimi kullanılmalıdır:

XX.objects.filter(y__disp_name__istartswith='string') 

(bu teknik nedeni filter bu parametreler olduğunu aslında bir işlev için anahtar kelime argümanlarıdır, bu yüzden bunun sol tarafındaki bir ifade yerine bir dize olmalıdır.)

+0

Üzgünüz, şirket kuralları. Teşekkürler, bu sorunu çözdü! Django, '__' deki LHS bölümünü böler ve onu alanlar olarak kullanır? –

+1

Evet, oldukça fazla olsa da, doğal olarak, bu türden birleştirme türünden ('in', 'istartswith', vb.) Gelenleri ayırma gereği nedeniyle daha karmaşıktır. İlgilendiğinizde, 'django.db.models.sql.query.Query.add_filter' koduna bakın. –