Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Django比较两个不同模型的数据_Python_Django_Django Models - Fatal编程技术网

Python 使用Django比较两个不同模型的数据

Python 使用Django比较两个不同模型的数据,python,django,django-models,Python,Django,Django Models,我正在尝试比较两个Django模型,其中包含一些常用字段lastname、firstname等。。。。以便在回答是或否时应用流程 我有两种型号: 提供个人身份的人,有很多字段,如姓、名、生日等。。。 出生证明这是一种行为,当一个新的孩子出生时填写一些字段:名字,姓氏。。。 有了这两个模型,我就有了共同的字段,我想比较一下这些字段,以便应用两个不同的过程 我的模型看起来像: class Person(models.Model): social_number = models.CharFi

我正在尝试比较两个Django模型,其中包含一些常用字段lastname、firstname等。。。。以便在回答是或否时应用流程

我有两种型号:

提供个人身份的人,有很多字段,如姓、名、生日等。。。 出生证明这是一种行为,当一个新的孩子出生时填写一些字段:名字,姓氏。。。 有了这两个模型,我就有了共同的字段,我想比较一下这些字段,以便应用两个不同的过程

我的模型看起来像:

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=' ')

第一种情况:

假设我们在人和出生证之间有相同的人。为此,我们比较了4个字段:姓、名、生日、出生地

如果这是真的,我会选择BirthCertificate.social\u编号,并根据之前的值更新我的字段Person.social\u编号

如果为false,我会亲自创建一个新的社交电话号码,并用新号码更新Person.social

通常,真正的可能性对应于一个新生婴儿。首先,我们制作出生证明,然后创建一个包含更多细节的身份证明。假可能性对应于没有出生证明的成年人

最终,目标是给每个人一个唯一的社会号码

我的函数如下所示:

@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)
我的问题是:

如何在代码中编写比较部分

我为许多英语错误道歉,并希望能简明扼要

多谢各位

编辑:

但我得到:

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

我认为您不能这样做,因为BirthCertificate.objects.all.valueslastname提供了一个ValueQuerySet

所以你可以

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


好的,我发现了相同的条件,但我不知道。存在!如果我想获取相应的社会号码,我尝试打印BirthCertificate.objects.getsocial号码,但太多的值无法解包。exists是检查该对象是否存在。如果需要对象BirthCertificate.objects.filter firstname=person.firstname、lastname=person.lastname等。。够了。它将获得所有具有该条件的对象。循环它将获得所有实例。我编辑了我的问题,但我没有克服仅获取社会号码的困难。如果前面的条件都得到尊重,请查看django查询文档。我更新了答案。在我的答案中也没有更新的问题中看到的值。我将花点时间再次阅读django查询文档。不管怎样,谢谢你,这似乎奏效了;
<QuerySet [{'social_number': u'2 08 12 STRASBOURG - 039838'}]>
2 08 12 STRASBOURG - 039838
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()