Pereiti prie turinio

meshkis

Nariai
  • Pranešimai

    55
  • Užsiregistravo

  • Lankėsi

  • Atsiliepimai

    0%

meshkis Pranešimai

  1. 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ę :) .

  2. 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)

  3. 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 :)

  4. 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()

×
×
  • Pasirinkite naujai kuriamo turinio tipą...