2008-10-31 34 views
8

Django QuerySet API'sini kullanarak bir M2M ilişkide tam dış birleştirme için nasıl bir sorgu oluşturabilirim?django içinde tam dış birleştirme

Bu desteklenmiyor, bunu yapmak için kendi yöneticimi oluşturma konusunda bazı ipuçları memnuniyetle karşılanacaktır. eklemek için

Düzenlendi: S.Lott @ : aydınlanma için teşekkürler. DIŞ JOIN gereği uygulamadan geliyor. Hala eksik olsa bile girilen verileri gösteren bir rapor oluşturmalıdır. Sonucun yeni bir sınıf/model olacağı gerçeğinin farkında değildim. İpuçların bana biraz yardımcı olacak.

cevap

11

Django, her zamanki SQL anlamında "birleştirmeler" desteklemez - nesne gezinmeyi destekler.

İlişkisel bir birleşimin (iç veya dış) yeni bir "sınıf" varlık yarattığını unutmayın. Django'da bir tanımı olmayan biri. Böylece, geri döndüğünüz şeyler için sınıf tanımı bulunmadığından uygun bir "sonuç kümesi" yoktur. Yapabileceğiniz en iyi şey, eksik kombinasyonlar için Yok ile paketlenecek bir tuple tanımlamaktır.

Sol (veya sağ) dış birleştirme buna benzer. Bu iki ayrık altkümeyi, ilişkili bir dizi ilişkili varlığa sahip olanları ve olmayanları oluşturur.

for obj in Model1.objects.all(): 
    if obj.model2_set().count() == 0: 
     # process (obj, None) -- no Model2 association 
    else: 
     for obj2 in obj.model2_set.all(): 
      # process (obj, obj2) -- the "inner join" result 

A "Tam" dış birleştirme, ilişkileri olmayan kalan öğelerin birleşimidir.

for obj2 in Model2.objects.all(): 
    if obj2.model1_set().count() == 0: 
     # process (None, obj2) -- no Model1 association 

Sorun her zaman, nesnelerin üç farklı alt kümesinin bu garip koleksiyonuyla hangi işlem yapıyorsunuz?

Nesne veritabanının noktası, işlemin nesneye ve ilişkili nesnelere odaklanmasıdır.

"İlişkisel birleştirme" adı verilen özgün koleksiyon asla orijinal nesne modelinde değildir. İki (veya daha fazla) orijinal nesneden oluşturulan yeni bir nesne sınıfı.

Daha da kötüsü, dış birleştirmeler birden fazla alt sınıfla (iç birleştir, sol dış birleştir ve sağ dış birleştirmeyle) bir koleksiyon oluşturur. 'un bu koleksiyonu'un anlamı nedir?

Bekleyin, daha da kötüye gidebilir. Işlem eksik öznitelikleri (yani if someObj.anObj2attribute is None için denetler içeriyorsa: Model2 no'lu nesneyle ilişkili Model1 öğelerini arıyoruz. Ummm ... neden bunları dış birleştirmeye koyduk, sadece onları bir if deyimi kullanarak filtreleyelim? Neden sadece düzgün ayrı sorguları her alt kümesini amd sürecini yapamaz


Edit:?.. "eksik" durumu gösteriyorsanız, bu bir dış birleşim hiç değil Bu daha basit oluşturmak gerekir Şablonunuzun görüntülenebilmesi için görünüm fonksiyonunuzdaki bir (veya iki) ayrı koleksiyon

Öncelikle, durum kodlarını kullanmalısınız, yok veya yok yabancı bir anahtarın nce. İsteğe bağlı yabancı anahtarların "nedenleri" yoktur - ya orada ya da orada değiller. Bir durum kodu anlamın yararlı tonlarını ("eksik", "hatalı", "bozuk", "uygulanamaz", "silinecek" vb. Sağlayabilir.) (012) Bu ikisi, bir tam dış birleştirmenin iki birleştirilmemiş bölümüdür. Bu iki hata listesini şablonunuzda uygun sütun başlıkları ve durum kodları ve her şey ile görüntüleyebilirsiniz.

Hatta eski tam dış taklit etmek tek bir tablo içine koyabilirsiniz raporu katılmak

<table> 
    <tr><th>Model1</th><th>Model2</th></tr> 
    {% for e1 in errorList1 %} 
    <tr><td>e1</td><td>NULL</td></tr> 
    {% endfor %} 
    {% for e2 in errorList2 %} 
    <tr><td>NULL</td><td>e2</td></tr> 
    {% endfor %} 
</table> 

tam dış benziyor görmek için kullanılır rapor türüne katıl. Tam dış birleşim olmadan.

+0

Haklısınız. Python'da "FULL OUTER JOIN" için gerekli tabloyu hesaplayan bir görünüm yazacağım ve sonucu render için şablona gönderir. Teşekkürler. – Ber

İlgili konular