Django lekérdezés köztes tábla használatával
2022-05-10T11:24:19+02:00
2022-07-29T00:38:53+02:00
2022-07-30T01:56:55+02:00
MarkShad
Sziasztok!

Van az alábbi két táblám (Models) egyszerűsítem őket:

class Person(models.Model): first_name = models.CharField() last_name = models.CharField() phone = models.IntegerField() class Company(models.Model): name = models.CharField()
És van egy köztes táblám, amit kapcsolótáblaként használok:

class CompanyEnrollment(models.Model): person = models.ForeignKey(Person, on_delete=models.CASCADE, related_name="enrollperson") company = models.ForeignKey(Company, on_delete=models.CASCADE, related_name="enrollcompany")
Azt szeretném elérni,hogy egy szótárba összegyújtsem az összes Person adatot, de úgy, hogy tartalmazza (ha van) a személyhez rendelt Company_name mezőt is! Van erre valami megoldás, hogy a HTML sablonba keljen mókolni? 

Ha így szedem össze, csak azok a Person-ok jelennek meg, akiknek van összekapcsolása és az így nem tökéletes. 

datas = CompanyEnrollment.objects.all().select_related('company')
Előre is köszönöm a segítséget! Ezt mindenképpen szeretném megérteni...
Mutasd a teljes hozzászólást!

  • A person-tól indulsz el. Először left join-olod a company_enrollment táblát, másodszor left join-olod a company táblát. Én az egyszerűség kedvéért kicsit más táblákkal dolgoztam, de a lényeg ugyanaz.

    CREATE TABLE person (person_id int primary key auto_increment, name text); CREATE TABLE company (company_id int primary key auto_increment, name text); CREATE TABLE company_enrollment (person_id int, company_id int, foreign key (person_id) references person(person_id), foreign key (company_id) references company(company_id)); insert into person (name) VALUES ("Béla"), ("Pista"); insert into company (name) VALUES ("Lehúzó BT"); insert into company_enrollment VALUES (1,1);
    A lekérdezés:

    select person.person_id, person.name as person_name, company.company_id, company.name as company_name from person left join company_enrollment on person.person_id = company_enrollment.person_id left join company on company_enrollment.company_id = company.company_id
    Az eredményhalmaz:

    person_id person_name company_id company_name 1 Béla 1 Lehúzó BT 2 Pista (null) (null)
    Hogy ez Django-ban hogy néz ki, annak mindjárt utána nézek.
    Mutasd a teljes hozzászólást!
  • Ahogy elnézem, ehhez muszáj leszel raw sql-t használni:

    raw_sql = """SELECT ... FROM person LEFT JOIN ...""" result = Person.objects.raw(raw_sql);
    Mutasd a teljes hozzászólást!
  • van még egy lehetősége az sql beégetésen kívül. (bár a template mókolás sem sokkal hosszabb)

    models.py

    class Person(models.Model): first_name = models.CharField(max_length=255) last_name = models.CharField(max_length=255) phone = models.IntegerField(default=3) def companies(self): x = [] if self.enrollperson.count()>0: for ep in self.enrollperson.all(): x.append(ep.company.name) return ', '.join(map(str, x)) return '-' companies.allow_tags = True
    template:

    <h1>only template</h1> <table border="1"> <tr> <th>first name</th> <th>last name</th> <th>phone number</th> <th>company</th> </tr> {% for person in peoples %} <tr> <td>{{person.first_name}}</td> <td>{{person.last_name}}</td> <td>{{person.phone}}</td> <td> <ul> {% for ep in person.enrollperson.all %} <li>{{ep.company.name}}</li> {% endfor %} </ul> </td> </tr> {% endfor %} </table> <h1>model.py allow_tags</h1> <table border="1"> <tr> <th>first name</th> <th>last name</th> <th>phone number</th> <th>company</th> </tr> {% for person in peoples %} <tr> <td>{{person.first_name}}</td> <td>{{person.last_name}}</td> <td>{{person.phone}}</td> <td>{{person.companies}}</td> </tr> {% endfor %} </table>

    a kimenettel értelem szerűen azt csinálsz amit szeretnél, én csak összefűztem a neveket
    Mutasd a teljes hozzászólást!
abcd