2017-10-10 37 views
0

我使用的是Django 1.11,爲了將我的MySQL Join request轉換爲Django QuerySet語法,我想獲得正確的語法。`MySQL JOIN`和Django之間的等效代碼

我有3點不同的模式(以我的身份申請1種模式,在我的財政申請2型)如下:

#Identity.Individu 

class Individu(models.Model): 

    NumeroIdentification = models.CharField(max_length=30, null=True, verbose_name='Numero Identification physique', unique=True) 
    Civilite = models.CharField(max_length=12,choices=CHOIX_TITRE, verbose_name='Civilité') 
    NomJeuneFille = models.CharField(max_length=30, verbose_name='Nom de jeune fille', blank=True) 
    Nom = models.CharField(max_length=30, verbose_name='Nom de famille') 
    Prenom = models.CharField(max_length=30, verbose_name='Prénom(s)') 

#Fiscal.Profession 

class Profession (models.Model) : 

    Employe = models.ForeignKey(Individu, related_name='Individu', verbose_name='Individu', null=False, to_field='NumeroIdentification') 
    Entreprise = models.ForeignKey(Societe, related_name='Société', verbose_name='Société', null=False, to_field='NumeroIdentification') 
    NumeroImpot = models.CharField(max_length=30, null=True, verbose_name='Numéro Imposition', unique=True) 
    Profession = models.CharField(max_length=30, verbose_name='Profession') 

#Fiscal.Salaire 

class Salaire (models.Model) : 

    Employe = models.ForeignKey(Individu, related_name='Salaire_Individu', verbose_name='Salaire_Individu', null=False, to_field='NumeroIdentification') 
    Salaire_B_mensuel = models.IntegerField(verbose_name='Salaire Brut Mensuel') 
    Salaire_N_mensuel = models.IntegerField(verbose_name='Salaire Net Mensuel') 

與MySQL,我有這樣的要求的正常工作:

SELECT * FROM Identity_individu i 
    INNER JOIN Fiscal_profession p ON i.NumeroIdentification = p.Employe_id 
    INNER JOIN Fiscal_salaire s on i.NumeroIdentification = s.Employe_id; 

我的事情我必須使用prefetch_related,我寫這個(第一步,兩個表之間的連接):

@login_required 
def FiscalReporting(request) : 

    Contribuable = Individu.objects.prefetch_related("Profession").all().filter(NumeroIdentification=Profession.Employe) 

    context = { 
     "Contribuable" : Contribuable, 
     } 

    return render(request, 'Fiscal_Reporting.html', context) 

在我的模板:

<table style="width:120%"> 
      <tbody> 
      <tr> 
       <th>ID</th> 
       <th>État</th> 
       <th>N° Identification</th> 
       <th>Civilité</th> 
       <th>Nom</th> 
       <th>Prénom</th> 
       <th>Date de Naissance</th> 
       <th>N° Fiscal</th> 
       <th>Salaire Annuel Net</th> 
      </tr> 
      {% for item in Contribuable %} 
      <tr> 
       <td>{{ item.id}}</td> 
       <td>{{ item.Etat}}</td> 
       <td>{{ item.NumeroIdentification}}</td> 
       <td>{{ item.Civilite }}</td> 
       <td>{{ item.Nom }}</td> 
       <td>{{ item.Prenom }}</td> 
       <td>{{ item.DateNaissance }}</td> 
       <td>{{ item.NumeroImpot }}</td> 
       <td>{{ item.Employe.Salaire_N_annuel }}</td> 
      </tr> 
      {% endfor %} 
      </tbody> 
     </table> 

關於我的問題,你知道嗎?到目前爲止我沒有找到任何結果,因爲我的數組是空的:/

然後,我如何在我的Django QuerySet中添加補充連接?

回答

1

您可以使用prefetch_related預取一個以上的相關表是這樣的:

Contribuable = Individu.objects.prefetch_related("Individu", "Salaire_Individu") 

請注意,我用"Individu" related_name Profession模型prefetch_related說法。

現在的模板,你可以在每個迭代的職業和Salaire_Individu這樣的:

{% for item in Contribuable %} 
    ... 
    <td>{{ item.Nom }}</td> 
    {% for profession in item.Individu.all %} 
     <td>{{ profession.NumeroImpot }}</td> 
    {% endfor %} 
    {% for salary in item.Salaire_Individu.all %} 
     <td>{{ salary.Salaire_B_mensuel }}</td> 
    {% endfor %} 
{% endfor %} 
+0

'select_related'更接近SQL加入該'prefetch_related',其實'select_related'是一個SQL JOIN。 https://stackoverflow.com/questions/31237042/whats-the-difference-between-select-related-and-prefetch-related-in-django-orm – luxcem

+0

我試過你的語法,但我在我的數組中遇到問題。我在'Contribuable'中循環每個項目,並且可以顯示'Nom',...(來自'Individu'表格的字段)。但是我也應該顯示Table'Profession'和'Salaire'的元素吧? 正如你可以看到我的問題:'item.Nom'工作正常,但'item.NumeroImpot'不顯示元素。我的語法是錯誤的? – Deadpool

+0

@Deadpool嘗試更新的變體。 – neverwalkaloner