Python Django API REST框架:基于CreateAPIView生成字符串

Python Django API REST框架:基于CreateAPIView生成字符串,python,django,django-rest-framework,Python,Django,Django Rest Framework,我希望在我的web应用程序中使用Django API REST框架,但我在项目中遇到了一个问题 在我的申请中,我填写了一张Django表格,以便在我的数据库中注册一个新人 我的模型看起来像: class Individu(models.Model): NumeroIdentification = models.CharField(max_length=30, null=True, verbose_name='Numero Identification physique', unique

我希望在我的web应用程序中使用Django API REST框架,但我在项目中遇到了一个问题

在我的申请中,我填写了一张Django表格,以便在我的数据库中注册一个新人

我的模型看起来像:

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)')
    Sexe = models.CharField(max_length=30, choices=CHOIX_SEXE, verbose_name='Sexe')
    Statut = models.CharField(max_length=30, choices=CHOIX_STATUT, verbose_name="Statut civil")
    DateNaissance = models.DateField(verbose_name='Date de naissance')
    VilleNaissance = models.CharField(max_length=30, verbose_name='Ville de naissance')
    PaysNaissance = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
    ...
字段
numeriodentification
Null
,但当我提交表单并被重定向到下一个模板时,我有以下功能:

def Identity_Individu_Resume(request, id) :

    personne = get_object_or_404(Individu, pk=id)

    obj = Individu.objects.filter (
                                        Prenom=personne.Prenom, 
                                        Nom=personne.Nom, 
                                        DateNaissance=personne.DateNaissance, 
                                        VilleNaissance=personne.VilleNaissance
                                        )

    if obj:
        sc_obj = obj[0] #check if multiple objects are there, means obj[1]

        #Man = 1 / Woman = 2
        sex_number = []
        if personne.Sexe == 'Masculin' :
            sex_number = 1
        else :
            sex_number = 2

        #Get birthday
        birthyear_temp = str(personne.DateNaissance.year)
        birthyear_temp2 = str(birthyear_temp.split(" "))
        birthyear = birthyear_temp2[4] + birthyear_temp2[5]

        #Get birthmonth
        birthmonth_temp = personne.DateNaissance.month
        if len(str(birthmonth_temp)) == 1 :
            birthmonth = '0' + str(birthmonth_temp)
        else :
            birthmonth = birthmonth_temp

        #Get birthcity
        birth_city = personne.VilleNaissance

        #Get random number :
        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

        NumeroIdentification = str(sex_number) + str(birthyear) + str(birthmonth) + str(birth_city) + '-' + str(key)

        #Update NumeroIdentification
        personne.NumeroIdentification = NumeroIdentification
现在我正试图在API REST中实现这个函数

我有一个名为
serializer.py的文件

class IndividuCreateSerializer(serializers.ModelSerializer) :
    class Meta :
        model = Individu
        fields = [
            #'id',
            #'NumeroIdentification',
            'Civilite',
            'Nom',
            'Prenom',
            'Sexe',
            'Statut',
            'DateNaissance',
            'VilleNaissance',
            'PaysNaissance',
            'Nationalite1',
            'Nationalite2',
            'Profession',
            'Adresse',
            'Ville',
            'Zip',
            'Pays',
            'Mail',
            'Telephone',
            #'Creation',
            #'InformationsInstitution',
            #'Utilisateur',
            'Etat',
            #'Image',
            #'CarteIdentite',
        ]
api.views.py
文件:

from rest_framework.generics import (
    CreateAPIView,
    UpdateAPIView,
    DestroyAPIView,
    ListAPIView, 
    RetrieveAPIView,
    )


from Identity.models import Individu
from .serializers import IndividuSerializer, IndividuCreateSerializer

class IndividuListAPIView(ListAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuSerializer

class IndividuCreateAPIView(CreateAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuCreateSerializer

class IndividuDetailAPIView(RetrieveAPIView):
    queryset = Individu.objects.all()
    serializer_class = IndividuSerializer

class IndividuUpdateAPIView(UpdateAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuSerializer

class IndividuDeleteAPIView(DestroyAPIView) :
    queryset = Individu.objects.all()
    serializer_class = IndividuSerializer

我如何在我的API中添加关于
numeriodentification
生成器的部分(我的软件中的Identity\u Individu\u Resume)?

您可以为此重写
individualCreateSerializer
创建方法:

class IndividuCreateSerializer(serializers.ModelSerializer):
    ...
    def create(self, validated_data):
        obj = Individu.objects.create(**validated_data)
        Identity_Individu_Resume(obj)
        return obj

请注意,在我的示例中,您将不经请求直接将Individu对象传递给
Identity\u Individu\u Resume
函数,因此您需要对
Identity\u Individu\u Resume
函数进行一些修改。

您可以覆盖
Individual CreateSerializer
创建方法:

class IndividuCreateSerializer(serializers.ModelSerializer):
    ...
    def create(self, validated_data):
        obj = Individu.objects.create(**validated_data)
        Identity_Individu_Resume(obj)
        return obj
请注意,在我的示例中,您将不经请求直接将Individu对象传递给
Identity\u Individu\u Resume
函数,因此您需要对
Identity\u Individu\u Resume
函数进行一些修改。

您可以尝试使用

你可以尝试使用


哇,这对我来说有点晦涩。这是我第一次使用Django API REST^^@Deadpool。此方法的基本思想是在创建对象后,在自定义创建过程中添加一些逻辑。您可以在这里找到序列化程序的create方法重写的示例,好的,所以我根据django rest框架文档编写了您的答案,我得到了这个问题:
Exception Type:TypeError at/api/Identity/create/Exception Value:Identity\u Individu\u Resume()正好接受2个参数(给定1个)
我没有对
Identity\u Individu\u Resume
进行修改,因为我不知道如果您无法更改
Identity\u Individu\u Resume
或使用另一个函数,则是否必须删除
请求参数
@Deadpool,您可以从
创建
方法调用它,并传递request和object id:
Identity\u Individu\u Resume(self.context.get('request'),obj.id)
。是的,它似乎可以工作;)非常感谢你!我被这类事情困住了,所以我道歉:/哇,这对我来说有点模糊。这是我第一次使用Django API REST^^@Deadpool。此方法的基本思想是在创建对象后,在自定义创建过程中添加一些逻辑。您可以在这里找到序列化程序的create方法重写的示例,好的,所以我根据django rest框架文档编写了您的答案,我得到了这个问题:
Exception Type:TypeError at/api/Identity/create/Exception Value:Identity\u Individu\u Resume()正好接受2个参数(给定1个)
我没有对
Identity\u Individu\u Resume
进行修改,因为我不知道如果您无法更改
Identity\u Individu\u Resume
或使用另一个函数,则是否必须删除
请求参数
@Deadpool,您可以从
创建
方法调用它,并传递request和object id:
Identity\u Individu\u Resume(self.context.get('request'),obj.id)
。是的,它似乎可以工作;)非常感谢你!我对这类事情很感兴趣,所以我向你道歉:/谢谢,但我不太明白你在做什么。这是添加计算字段,我认为你的
个人简历
返回结果,这是我的错误,抱歉如果我使用你的方法,
数字识别
在提交表单后总是
。谢谢,但是我不太明白你在做什么。这是添加计算字段,我认为你的
个人简历
返回结果,这是我的错误,如果我使用你的方法,
数字识别
在提交表单后总是