2016-04-08 33 views
0

Django uygulamalarından birinde iki veritabanı motoru A ve B kullanıyoruz, her ikisi de aynı veritabanında ancak farklı şemalarla. Her iki şemada C adında bir tablo var ama her zaman veritabanı B'ye işaret etmek için db yönlendirme kullanıyoruz. A modellerinden birinden bir valuelist queryset oluşturduk, filtre koşulunu __in kullanarak C tablosunda aynı şekilde geçirmeye çalıştık ama eşleşen kayıtları olsa da her zaman boş alır. Değer listesi queryset'i bir listeye dönüştürdüğümüzde ve __in filtre koşulu kullanılarak tablo C'de kullanıldığında, iyi çalışır.django değerler listesi veritabanı motorları arasında queryset

Django dokümanlar ve diğer çok sorular okudum

data = modelindbA.objects.values_list('somecolumn',flat=True) 
data = list(data) 
info = C.objects.filter(somecolumn__in=data).values_list 

Çalışma

data = modelindbA.objects.values_list('somecolumn',flat=True) 
info = C.objects.filter(somecolumn__in=data).values_list 

Çalışmıyor, göreceli bir şey bulamadı. Tahminimce, her iki model de farklı veritabanı şemalarında olduğundan, yukarıda çalışmaz. Bu sorunun nasıl giderileceği konusunda yardıma ihtiyacım var.

cevap

0

__in ile bir queryset kullandığınızda, Django, __in yan tümcesi için bir alt sorgu kullanan tek bir SQL sorgusu oluşturacaktır. İki tablo farklı veritabanlarında olduğundan, hiçbir satır eşleşmeyecek. Buna karşılık, ilk sorgulamayı bir listeye dönüştürürseniz, Django devam edecek ve ilk veritabanındaki verileri getirecektir. Bu verileri ikinci sorguya ilettiğinizde, ikinci veritabanına isabet ettiğinizde, beklendiği gibi çalışır.

fazla ayrıntı için documentation for the in field lookup bakınız: Ayrıca değişmez değerler listesi sağlama yerine dinamik değerler listesini değerlendirmek için bir Sorgu Kümesi kullanabilirsiniz

.... Bu sorgu alt seçim ifadesi olarak değerlendirilecektir : values_list yöntem django.db.models.query.QuerySet döner

SELECT ... WHERE blog.id IN (SELECT id FROM ... WHERE NAME LIKE '%Cheddar%') 
+0

Teşekkür ederim Kevin. Ayrıca ben de bu şekilde denedim ama didn; daha fazla bulmaca beni işe yarar :( data = liste (modelindbA.objects.values_list ('somecolumn', düz = Doğru)) info = C.objects.filter (somecolumn__in = data) .values_list Bunun için çalışmayı bekliyordum çünkü listeyi kullanırken db isabeti zorlanmış olurdu ve değerler zaten veri nesnesine girmiş olurdu. Ama bu işe yaramıyor. Bu gariplik hakkında biraz bilgi verebilir misiniz? davranış, bu konuda bilgi için çok teşekkürler – Giri

+0

@Giri: Kafam karıştı, senin sorununun "Çalışma" olduğunu söyledin. –

+0

Kevin Değerler listesi queryset'i bir listeye çevirmek ve modeli başka bir veritabanında sorgulamak demek Şüphem:
data = list (listindbA.objects.values_list ('somecolumn', flat = True)) Yukarıdaki "listeyi" kullanarak hemen veritabanı isabeti olacak ve değerler f olacaktır. modelden kazınmış ve değişken "veri" olacaktır. Şimdi bu "data" değişkenini
info = C.objects.filter (somecolumn__in = data) üzerinden kullanırsam.values_list, bunu şimdiye kadar "data" değişkeninde zaten var olan nesne olarak çalışmak için bekliyordum. – Giri

0

için, bir li st. Aynı şema ile kullandığınızda, orm optimize eder ve sadece bir sorgu yapmalıdır, ancak şemalar farklı olduğunda başarısız olur. Sadece listeyi kullanın().

Sorgu karmaşıklığını azaltabileceğinden ve büyük tablolar üzerinde daha iyi çalışabileceğinden, bunu tek bir şema için kullanmanızı öneririz.