2012-08-06 11 views
9

İşte benim veritabanı sorgusu oluyor kullanma:Django: Annotatesekmesindeki, bir sorgu kümesi güvenin ve Farklı

results = Attachments.objects.filter(currency='current').annotate(num_attachments=Count('article_id')).order_by("num_attachments").distinct('article_id') 

olarak bozuldu sorgu (Anladığım kadarıyla) şöyle:

  • İlk filtre akım Ekler olduğunu Bu "geçerli".
  • Belirli bir 'article_id' ile ekli olan eklerin sayısını saymak için.
  • Ardından, her eki, ek numarası olan ek numarası ile birlikte, yaygın olarak makale_kimliği olanların sayısıyla birlikte not edin.
  • Ardından, eklerin sayısına göre sıralamak için.
  • Ardından, listeyi farklı şekilde ayırın, böylece her bir article_id değeri için bir Attachment nesnesi vardır.

Bunu PostgreSQL üzerinde çalıştırıyorum, bu nedenle Django docs'a göre, bir alana göre farklı() çalıştırmaya gayet iyiyim.

Orada sorgu çalıştırdığınızda hata, ama aşağıdaki hata Django ayıklama tarafından atılan sonuçlarını yazdırabilirsiniz bile yineleme ya çalıştığınızda:

NotImplementedError at /function/ 
annotate() + distinct(fields) not implemented. 

interaktif isteminden daha detaylı traceback olduğunu :

File "<console>", line 1, in <module> 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 118, in _result_iter 
    self._fill_cache() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 875, in _fill_cache 
    self._result_cache.append(self._iter.next()) 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/query.py", line 291, in iterator 
    for row in compiler.results_iter(): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 763, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 808, in execute_sql 
    sql, params = self.as_sql() 
    File "/Users/Pat/.virtualenvs/envsp/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 107, in as_sql 
    "annotate() + distinct(fields) not implemented.") 
NotImplementedError: annotate() + distinct(fields) not implemented. 

Burada neler olup bittiğini bilen var mı?

+2

oldukça yalındır görünüyor. 'NotImplementedError' bir Django istisnasıdır. Kod, şu anda "annotate" ve "distinct" (alanları ile birlikte) birleştiremediğinizi bildirmek için yükseltiyor, yani şu an çalışmıyor. Gelecekte bununla ilgili herhangi bir sorunla uğraşabilirler, ancak şimdilik şansınız kalmadı. Her zaman sadece 'raw''e başvurabilir ve ne istersen onu yapabilirsin. –

+0

Yukarıdaki kod örneğinde bir noktayı kaçırıyorsunuz "." order_by ile farklı alan arasında. – Mikael

+0

@ Aynı şeyi gerçekleştirmek için alternatif bir sorgu (ham SQL'in yanı sıra) hakkındaki fikirleri öğrenin. – Pat

cevap

5

Çalışma, values('distinct_fieldname') kullanmaktır, çünkü bu son SQL deyimini bu alanda GROUP BY gerçekleştirecek (birden fazla alan adı ekleyebilirsiniz), aslında aynıdır. Örneğin

, bunu yapacağını verilen bir 'filename' için var kaç tane makale bilmek istiyorum:

results = Attachments.objects.filter(currency='current').values('filename').annotate(num_attachments=Count('article_id')).order_by("num_attachments") 
İlgili konular