我正在使用Django 1.11,我希望得到正确的语法,以便将MySQL Join request
翻译成Django QuerySet语法。
我有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中添加补充连接?
答案 0 :(得分:1)
您可以使用prefetch_related
预取多个相关的表格,如下所示:
Contribuable = Individu.objects.prefetch_related("Individu", "Salaire_Individu")
请注意,我使用"Individu"
相关的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 %}