2011-02-10 20 views
6

मैं Django मॉडल का उपयोग कर दो (या अधिक) शामिल तालिकाओं के साथ चयन कैसे कर सकता हूं?Django मॉडल और दो या दो से अधिक तालिकाओं में शामिल होने के साथ चयन करें?

उदाहरण के लिए:

class Album(models.Model): 
    artist = models.ForeignKey(Musician) 
    name = models.CharField(max_length=100) 
    release_date = models.DateField() 
    num_stars = models.IntegerField() 

class Song(models.Model): 
    album = models.ForeignKey(Album) 
    name = models.CharField(max_length=100) 
    num_stars = models.IntegerField() 

SELECT * from album, song where (album.id = song.album_id) and (album.artist_id = X) 
+0

मैं अपने डेटाबेस की सामग्री के लिए पूछ नहीं थी, लेकिन अपने मॉडल (या डेटाबेस स्कीमा) और एसक्यूएल आप प्रदर्शन करना चाहते हैं। – gruszczy

+0

मैंने इसे फिर से संपादित किया :) –

उत्तर

13

डीजेगो क्वेरीसेट मॉडल उदाहरणों की सूचियों को वापस करना चाहते हैं, जो एक ही परिणाम तालिका में शामिल कई तालिकाओं से डेटा लौटने की एसक्यूएल धारणा के लिए काफी मानचित्र नहीं है।

SQL क्वेरी आप एक उदाहरण के रूप प्रदान की प्रभाव को प्राप्त करने के लिए, आप निम्न में से एक कर सकता है:

1) आप गीत से अपने डेटा पर पुनरावृति करना चाहते हैं, तो आप गीत आप क्वेरी सीमित कर सकते हैं कलाकार आईडी, इसलिए तरह से:

songs = Song.objects.filter(album__artist__id=123) 
for song in songs: 
    print song.name 
    print song.album.name 
    ... do what ever you need to do with song here ... 

आप प्रदर्शन के बारे में चिंतित हैं, तो आप अपने क्वेरीसमूह को select_related() जोड़ सकते हैं।

# the depth argument tells django to only follow foreign key relationships 
# from Song one level deep 
songs = Song.objects.select_related(depth=1).filter(album__artist__id=123) 

for song in songs: 
    # django has now already fetched the album data, so accessing it 
    # from the song instance does not cause an additional database hit 
    print song.album.name 

2) आप एल्बम से अपने डेटा पर पुनरावृति करना चाहते हैं, तो आप ऐसा तरह कर सकते हैं:

albums = Album.objects.filter(artist__id = 123) 
for album in albums: 
    for song in album.song_set.all(): 
     print song.name 
     print album.name 
     ... etc ... 
+0

क्या इसका मतलब है कि अगर मैं अनुकूलित करना चाहता हूं, तो select_related() के साथ उदाहरण 1 का उपयोग करना बेहतर होगा? और अन्य सभी मामले 1 से अधिक का चयन करेंगे? –

+0

@ju - मुझे केवल एक प्रश्न में album.objects के माध्यम से संबंधित गीतों को पूर्व-प्राप्त करने का एक आसान तरीका नहीं दिख रहा है, क्योंकि select_related() को केवल एक ही तरीके से विदेशी_की संबंधों का पालन करने के लिए बनाया गया है। तो, हां, मुझे लगता है कि select_related() के साथ उदाहरण 1 शायद आपके डेटाबेस प्रश्नों को कम करना चाहते हैं तो जाने का तरीका होगा। – zlovelady

0

आप raw sql query प्रदर्शन कर सकते हैं, लेकिन यह शायद बात आप क्या करना चाहते नहीं है। समझाएं कि आपके मॉडल कैसा दिखते हैं और आप क्या हासिल करना चाहते हैं और शायद डीजेंगो ओआरएम क्वेरी करने के लिए पर्याप्त होगा।

+0

मैंने उदाहरण के साथ अपना प्रश्न संपादित किया :) –

संबंधित मुद्दे