meshkis
-
Pranešimai
55 -
Užsiregistravo
-
Lankėsi
-
Atsiliepimai
0%
Turinio tipas
Forumas
Kalendorius
Parduotuvė
Akademija
Skelbimai
meshkis Pranešimai
-
-
Pradžiai dėkui. Gerai, kai kelyje atsiranda orientyras :) .
-
Jau pradeda aiškėti. FK aš suprantu reikėtų taip daryti:
Brendas vienas, prekių daug, tai čia reikėtų :
class Brandai(models.Model): darbinis_pav = models.CharField(max_length=65) pavadinimas = models.CharField(max_length=65) def __unicode__(self): return self.pavadinimas
class Prekes (models.Model): brendo_id = models.ForeignKey(Brandai) kategorija = models.CharField(max_length=15) pavadinimas = models.CharField(max_length=100)
ir viena prekė turi kelis aprašymus
class Aprasymai (models.Model): content_id = models.ForeignKey(Prekes) kalbos_id = models.IntegerField() tekstas = models.TextField() lenta = models.CharField(max_length=45) column = models.CharField(max_length=65)
-
Dėkui už atrašymą. Bet čia kalba eina apie dvi lenteles :
pr = Preke.objects.get(...).select_related('brandas') # viskas ištraukiama šia užklausa
print pr.brandas # nieko nebekainuoja
O aš noriu padaryti užklausą iš trijų.
Pas mane yra trys lentos: Brendai, Prekės, Aprašymai ir man reikia, kad pasirinkus brendą, išrinktų atitinkamas prekes,
ir kiekviena prekė dar turi po du įrašus lentoj Aprašymai (vienas trumpam aprašymui, kitas ilgam). Visas rezultatas turėtų būti viena masyvo eilutė. Su SQL`u mano užklausa veikia gražiai, bet Djange nu niekaip neina padaryti . Atsimušiau į sieną.
Man geriau aiškinkit kaip pirmokui :)
-
Sveiki,
Esu Django pradedančiųjų kelyje ir susidūriau su tokiu klausimu - kaip Django apjungti kelias lenteles į vieną visumą.
Išnagrinėjau dokumentaciją, perskaičiau daug forumų, bet konkretaus atsakymo į klausimą taip ir neradau. Yra pilna pavyzdžių, kaip apjungti 2 lentas, o man reikia 3 ir daugiau, ir dar iš vienos lentos paimti iškart du įrašus. SQL užklausa yra tokia:
SELECT a.id prekes_id, a.pavadinimas pavadinimas, b.id brando_id, b.pavadinimas brendas, c.tekstas prekes_aprasymas, d.tekstas trumpas_aprasymas, e.tikras_vardas nuotrauka
FROM bazes_prekes a
LEFT JOIN bazes_brandai b ON b.id=a.brendo_id
LEFT JOIN bazes_aprasymai c ON c.kalbos_id='1' and c.content_id=a.id and c.lenta='prekes' and c.column='aprasymas'
LEFT JOIN bazes_aprasymai d ON d.kalbos_id='1' and d.content_id=a.id and d.lenta='prekes' and d.column='trump_aprasymas'
LEFT JOIN bazes_bylos e ON e.pagrindine='1' and e.content_id=a.id and e.lenta='prekes'
WHERE b.id = '1'
Esu radęs, kad SQL`ą galima tiesiogiai rašyti, bet kažkaip nesigauna (klaidos neišmeta, bet rezultatas gaunamas visiškai netoks):
def mano_sql():
from django.db import connection, transaction
cursor = connection.cursor()
cursor.execute("""
SELECT a.id prekes_id, a.pavadinimas pavadinimas, b.id brando_id, b.pavadinimas brendas, c.tekstas prekes_aprasymas, d.tekstas trumpas_aprasymas, e.tikras_vardas nuotrauka
FROM bazes_prekes a
LEFT JOIN bazes_brandai b ON b.id=a.brendo_id
LEFT JOIN bazes_aprasymai c ON c.kalbos_id='1' and c.content_id=a.id and c.lenta='prekes' and c.column='aprasymas'
LEFT JOIN bazes_aprasymai d ON d.kalbos_id='1' and d.content_id=a.id and d.lenta='prekes' and d.column='trump_aprasymas'
LEFT JOIN bazes_bylos e ON e.pagrindine='1' and e.content_id=a.id and e.lenta='prekes'
WHERE b.id = '1'""")
row = cursor.fetchone()
return row
Iškvietimas :
masyvas = mano_sql()
Django ORM ir SQL JOIN
Programuotojų kampas
Atrašyta · Redagavo meshkis
Gal kam bus įdomu:
Naujoj Django versijoj atsirado galimybė daryti užklausą panaudojant prefetch_related,
kuris mano atveju tikriausiai labiau tinka nei select_related.
Pridedu linką:
https://docs.djangoproject.com/en/dev/ref/models/querysets/#prefetch-related
O savo temos pradžioje duotame kode ištaisiau row = cursor.fetchone() į
row = cursor.fetchall() ir viskas susitvarkė. Kiek laiko teko paaukoti, kol radau šią mažą klaidelę :) .