相当于`MySQL JOIN`和Django

时间:2017-10-10 15:32:12

标签: mysql django

我正在使用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中添加补充连接?

1 个答案:

答案 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 %}