2016-04-14 49 views
0

Üç modelim var: Adres, Adres_Konumlandırma (Address_id, ForeignKey olduğunda) ve Adres_dosyaları (burada Address_id, ForeignKey'dir).Django/görünümler - modele dönüp şablona dön

İlk adımda tüm adresleri yerelleştirmesiyle almak istiyorum. address_users i bir adresi için iki (veya daha fazla) kullanıcıları var ise

data = address.objects.select_related().all().annotate(
      longitude=F('address_localisation__longitude'), 
      latitude=F('address_localisation__latitude') 
     ) 

ama bu (çünkü katılmadan modellerin) bana aynı adrese sahip iki (veya daha fazla) satırları verir: Ben kullanmaya çalıştı .

Yalnızca Adresleri ve bağlı yerelleştirmeleri almak istiyorum. i denedim Ne:

data = address.objects.prefetch_related('address_localisation_set').all() 

     for e in data.all(): 
      for ee in e.address_localisation_set.all():      
       e.longitude = ee.longitude 
       e.latitude = ee.latitude 

     data = list(data.values('id',    
     'longitude', 
     'latitude' 
      )) 

     data = json.dumps(data) 
     data = json.loads(data) 
     return JsonResponse(data, safe = False) 

Ama bir hata götürüyor: "alanına anahtar kelimenin 'boylamı' çözülemiyor Seçimler şunlardır:. Id .. (Adres modelinden listelenen fileds)"

Anladığım kadarıyla ana modelde boylam/enlem alanlarım yok ... ama onları nasıl eklemeliyim?

Şablonda address_localisation_set ile yineleyebileceğimi biliyorum (bunu denemedim, ancak stackoverflow üzerinde çözüm buldum), ancak alanlar ekleyerek kaynak kodumun başka bir yerinde yararlı olabilir, bu yüzden nasıl yapacağımı bilmek istiyorum o.

zaman için şimdiden teşekkür ederiz

cevap

0

Gerçekten bir model için alanları ekleyemezsiniz; ancak model örneğine herhangi bir öznitelik ekleyebilirsiniz, çünkü Python nasıl çalışır? - bir nesne "anında" atanabilir; Ama bu senaryosunda ihtiyacın olan şey değil.

Özel bir veri kümesi oluşturmak ve kolayca görünümünde yapılır Şablonunuza, göndermek gerekir

:

results = [] # This is what you will send to the template 

for location in address.objects.select_related(): 
    data = {} # an empty dictionary 
    localized_data = location.address_localisation_set.first() 
    data['lat'] = localized_data.latitude 
    data['lon'] = localized_data.longitude 
    data['id'] = location.id 
    results.append(data) 

return JsonResponse(json.dumps(results), safe=False) 
+0

teşekkür ederiz! Bu benim problemimi çözüyor, düşündüğümden daha basit :) –