簡體   English   中英

使用Django比較來自兩個不同模型的數據

[英]Compare data from two different models with Django

我正在嘗試將兩個Django models與一些常見字段( lastnamefirstname ,....)進行比較,以便在答案為“是”或“否”的情況下應用流程。

我有兩種模式:

  • (具有很多字段,例如lastnamefirstnamebirthday等),以給出人的身份
  • BirthCertificate (當一個新生孩子出生時,帶有以下字段的行為會被填充: firstnamelastname ,...)

對於這兩個模型,我擁有共同的領域,並且我將比較這些領域以應用兩個不同的過程。

我的模型如下:

class Person(models.Model):

    social_number = models.CharField(max_length=30, null=True, verbose_name='numero social')
    title = models.CharField(max_length=12,choices=TITLE_CHOICES, verbose_name='Civilité')
    young_girl_lastname = models.CharField(max_length=30, verbose_name='Nom de jeune fille', blank=True)
    lastname = models.CharField(max_length=30, verbose_name='Nom de famille')
    firstname = models.CharField(max_length=30, verbose_name='Prénom(s)')
    sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
    status = models.CharField(max_length=15, choices=STATUS_CHOICES, verbose_name="Statut civil")
    birthday = models.DateField(verbose_name='Date de naissance')
    birthcity = models.CharField(max_length=30, verbose_name='Ville de naissance')
    birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
    birthmairie = models.CharField(max_length=30, verbose_name='Mairie de naissance')
    nationality = models.CharField(max_length=30, verbose_name='Nationalité')
    job = models.CharField(max_length=30, verbose_name='Profession')
    adress = models.CharField(max_length=30, verbose_name='Adresse')
    city = models.CharField(max_length=30, verbose_name='Ville')
    zip = models.IntegerField(verbose_name='Code Postal')
    country = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays')
    mail = models.CharField(max_length=30, verbose_name='Email', blank=True)
    phone = models.CharField(max_length=20, verbose_name='Téléphone', blank=True)
    created = models.DateTimeField(auto_now_add=True)
    mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie', default=' ')

class BirthCertificate(models.Model):

    lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille')
    firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)')
    sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
    birthday = models.DateField(null=False, verbose_name='Date de naissance')
    birthhour = models.TimeField(null=True, verbose_name='Heure de naissance')
    birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance')
    birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
    fk_parent1 = models.ForeignKey(Person, related_name='ID_Parent1', verbose_name='ID parent1', null=False)
    fk_parent2 = models.ForeignKey(Person, related_name='ID_Parent2', verbose_name='ID parent2', null=False)
    mairie = models.CharField(max_length=30, null=False, verbose_name='Mairie')
    social_number = models.CharField(max_length=30, null=True, verbose_name='numero social')
    created = models.DateTimeField(auto_now_add=True)

第一種情況:

假設我們在PersonBirthCertificate之間擁有相同的人。 為此,我們比較4個字段: lastnamefirstnamebirthdaybirthcity

如果是真的,則選擇BirthCertificate.social_number並通過以前的值更新字段Person.social_number

如果為假,則在Person創建一個新的social_number ,並通過新的來更新Person.social_number

通常,真正的可能性對應於一個新嬰兒。 首先,我們創建一個BirthCertificate,然后創建具有更多詳細信息的IdentityCertificate。 錯誤的可能性對應於沒有出生證明的成年人。

最終,目標是為每個人提供唯一的社交號碼。

我的功能看起來像這樣:

@login_required
def Identity_Resume(request, id) :

    # Form is validated with an empty `social_number` field
    # I pick up data previously created
    person = get_object_or_404(Person, pk=id)

    blastname = BirthCertificate.objects.all().values("lastname")
    bfirstname = BirthCertificate.objects.all().values("firstname")
    bbirthday = BirthCertificate.objects.all().values("birthday")
    bbirthcity = BirthCertificate.objects.all().values("birthcity")

    if person.lastname == blastname and person.firstname == bfirstname and person.birthday == bbirthday and person.birthcity == bbirthcity :
        # If all fields are identicals, I pick up the `social_number` from the true BirthCertificate id


    else :

        #Homme = 1 / Femme = 2
        sex_number = []
        if person.sex == 'Masculin' :
            sex_number = 1
            print sex_number
        else :
            sex_number = 2
            print sex_number

        #Récupère année de naissance
        birthyear_temp = str(person.birthday.year)
        birthyear_temp2 = str(birthyear_temp.split(" "))
        birthyear = birthyear_temp2[4] + birthyear_temp2[5]

        #Récupère mois de naissance
        birthmonth_temp = person.birthday.month
        if len(str(birthmonth_temp)) == 1 :
            birthmonth = '0' + str(birthmonth_temp)
        else :
            birthmonth = birthmonth_temp

        #Récupère N° Mairie (ici récupère nom mais sera changé en n°)
        birth_mairie = person.birthmairie
        print birth_mairie

        #Génère un nombre aléaloire :
        key_temp = randint(0,999999)
        if len(str(key_temp)) == 1 :
            key = '00000' + str(key_temp)
        elif len(str(key_temp)) == 2 :
            key = '0000' + str(key_temp)
        elif len(str(key_temp)) == 3 :
            key = '000' + str(key_temp)
        elif len(str(key_temp)) == 4 :
            key = '00' + str(key_temp)
        elif len(str(key_temp)) == 5 :
            key = '0' + str(key_temp)
        else :
            key = key_temp
        print key

        social_number = str(sex_number) + ' ' + str(birthyear) + ' ' + str(birthmonth) + ' ' + str(birth_mairie) + ' - ' + str(key) 
        print social_number

        #Mise à jour du champ numéro sécurité social
        person.social_number = social_number
        person.save()

    context = {
                "person" : person,
                "social_number" : social_number,
                "blastname" : blastname,
                "bfirstname" : bfirstname,
                "bbirthday" : bbirthday,
                "bbirthcity" : bbirthcity,
    }

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

我的問題是:

如何在代碼中編寫比較部分?

對於許多英語錯誤,我深表歉意,並希望能有所作為。

謝謝

編輯:

@login_required
def Identity_Resume(request, id) :

    # Form is validated with an empty `social_number` field
    # I pick up data previously created
    person = get_object_or_404(Person, pk=id)

    social_number = BirthCertificate.objects.filter(firstname=person.firstname, lastname=person.lastname, birthday=person.birthday, birthcity=person.birthcity).values('social_number')
    print social_number

    if social_number.exists() :    
        person.social_number = social_number
        person.save()

但是我得到:

<QuerySet [{'social_number': u'2 08 12 STRASBOURG - 039838'}]>

不僅是:

2 08 12 STRASBOURG - 039838

我認為您不能這樣做,因為BirthCertificate.objects.all().values("lastname")提供了ValueQuerySet

所以你可以做

if BirthCertificate.objects.filter(
    firstname=person.firstname, 
    lastname=person.lastname, 
    etc..).exists(): #etc means other fields.

更新

person = get_object_or_404(Person, pk=id)

obj = BirthCertificate.objects.filter(firstname=person.firstname, lastname=person.lastname, birthday=person.birthday, birthcity=person.birthcity)

if obj:
    sc_obj = obj[0] #check if multiple objects are there, means obj[1]
    person.social_number = sc_obj.social_number
    person.save()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM