Python 无法使用django rest框架创建记录

Python 无法使用django rest框架创建记录,python,django,django-rest-framework,django-serializer,Python,Django,Django Rest Framework,Django Serializer,我试图通过从访问模型中获取一个对象,在状态模型中创建一个记录。但是,当传递值以创建记录时,由于需要的字段数据很少,所以出现了错误。下面给出了我的代码以及我正在传递的数据 models.py class Visit(models.Model): name = models.CharField(max_length=200, name="name") gender = models.CharField(choices=GENDER_CHOICE, max_length=1, name="

我试图通过从访问模型中获取一个对象,在状态模型中创建一个记录。但是,当传递值以创建记录时,由于需要的字段数据很少,所以出现了错误。下面给出了我的代码以及我正在传递的数据

models.py

class Visit(models.Model):
   name = models.CharField(max_length=200, name="name")
   gender = models.CharField(choices=GENDER_CHOICE, max_length=1, name="gender")
   mobile = models.CharField(max_length=18,default="", name="mobile")
   email = models.CharField(max_length=256, null=True, blank=True, name="email")
   address = models.TextField(null=True, blank=True, name="address")
   visit_type = models.IntegerField(choices=VISIT_TYPE, name="visit_type")
   visit_purpose = models.CharField(max_length=250, name="visit_purpose")
   visitor_photo = models.FileField(upload_to="visitor/",null=True, blank=True)
   id_photo = models.FileField(upload_to="id_card/",null=True, blank=True)
   date_created = models.DateTimeField(default=timezone.now, editable=False)

     def __str__(self):
         return self.name

    def save(self, *args, **kwargs):
        if not self.id:
          self.date_created = timezone.now()
        super(Visit, self).save(*args, **kwargs)

class Status(models.Model):
    visit = models.ForeignKey(Visit,on_delete=models.CASCADE)
    description = models.CharField(name="description",max_length=200)
    time = models.DateTimeField(null=True, blank=True)
    aproved = models.BooleanField(default=False)
    visit_complete = models.BooleanField(default=False)
    exit_time = models.DateTimeField(null=True, blank=True)
    date_created = models.DateTimeField(default=timezone.now, editable=False)

    def __str__(self):
        return self.visit.name

    def save(self, *args, **kwargs):
        if not self.id:
           self.date_created = timezone.now()
        super(Status, self).save(*args, **kwargs)
class VisitSerializers(serializers.ModelSerializer):
    class Meta:
       model = Visit
       fields = ('name','gender','mobile','email','address','visit_type','visit_purpose','visitor_photo','id_photo')


class StatusSerializers(serializers.ModelSerializer):
    visit = VisitSerializers(required=True)

    class Meta:
       model = Status
       fields = ('visit', 'description','time','aproved','visit_complete','exit_time')

    def create(self, validated_data):
       visit_data = validated_data.pop('visit')
       visit = VisitSerializers.create(VisitSerializers(), validated_data=visit_data)
       status, created =  StatusSerializers.objects.update_or_create(visit=visit,
                                description=validated_data.pop('description'))
    return status
@api_view(['GET', 'POST'])
def create_visitor(request):
   if request.method == 'GET':
      visitor = Visit.objects.all()
      serializer = VisitSerializers(visitor, many=True)
      return Response(serializer.data)
   elif request.method == 'POST':
     serializer = VisitSerializers(data=request.data)
     if serializer.is_valid(raise_exception=ValueError):
         serializer.create(validated_data=request.data)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
serializer.py

class Visit(models.Model):
   name = models.CharField(max_length=200, name="name")
   gender = models.CharField(choices=GENDER_CHOICE, max_length=1, name="gender")
   mobile = models.CharField(max_length=18,default="", name="mobile")
   email = models.CharField(max_length=256, null=True, blank=True, name="email")
   address = models.TextField(null=True, blank=True, name="address")
   visit_type = models.IntegerField(choices=VISIT_TYPE, name="visit_type")
   visit_purpose = models.CharField(max_length=250, name="visit_purpose")
   visitor_photo = models.FileField(upload_to="visitor/",null=True, blank=True)
   id_photo = models.FileField(upload_to="id_card/",null=True, blank=True)
   date_created = models.DateTimeField(default=timezone.now, editable=False)

     def __str__(self):
         return self.name

    def save(self, *args, **kwargs):
        if not self.id:
          self.date_created = timezone.now()
        super(Visit, self).save(*args, **kwargs)

class Status(models.Model):
    visit = models.ForeignKey(Visit,on_delete=models.CASCADE)
    description = models.CharField(name="description",max_length=200)
    time = models.DateTimeField(null=True, blank=True)
    aproved = models.BooleanField(default=False)
    visit_complete = models.BooleanField(default=False)
    exit_time = models.DateTimeField(null=True, blank=True)
    date_created = models.DateTimeField(default=timezone.now, editable=False)

    def __str__(self):
        return self.visit.name

    def save(self, *args, **kwargs):
        if not self.id:
           self.date_created = timezone.now()
        super(Status, self).save(*args, **kwargs)
class VisitSerializers(serializers.ModelSerializer):
    class Meta:
       model = Visit
       fields = ('name','gender','mobile','email','address','visit_type','visit_purpose','visitor_photo','id_photo')


class StatusSerializers(serializers.ModelSerializer):
    visit = VisitSerializers(required=True)

    class Meta:
       model = Status
       fields = ('visit', 'description','time','aproved','visit_complete','exit_time')

    def create(self, validated_data):
       visit_data = validated_data.pop('visit')
       visit = VisitSerializers.create(VisitSerializers(), validated_data=visit_data)
       status, created =  StatusSerializers.objects.update_or_create(visit=visit,
                                description=validated_data.pop('description'))
    return status
@api_view(['GET', 'POST'])
def create_visitor(request):
   if request.method == 'GET':
      visitor = Visit.objects.all()
      serializer = VisitSerializers(visitor, many=True)
      return Response(serializer.data)
   elif request.method == 'POST':
     serializer = VisitSerializers(data=request.data)
     if serializer.is_valid(raise_exception=ValueError):
         serializer.create(validated_data=request.data)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
views.py

class Visit(models.Model):
   name = models.CharField(max_length=200, name="name")
   gender = models.CharField(choices=GENDER_CHOICE, max_length=1, name="gender")
   mobile = models.CharField(max_length=18,default="", name="mobile")
   email = models.CharField(max_length=256, null=True, blank=True, name="email")
   address = models.TextField(null=True, blank=True, name="address")
   visit_type = models.IntegerField(choices=VISIT_TYPE, name="visit_type")
   visit_purpose = models.CharField(max_length=250, name="visit_purpose")
   visitor_photo = models.FileField(upload_to="visitor/",null=True, blank=True)
   id_photo = models.FileField(upload_to="id_card/",null=True, blank=True)
   date_created = models.DateTimeField(default=timezone.now, editable=False)

     def __str__(self):
         return self.name

    def save(self, *args, **kwargs):
        if not self.id:
          self.date_created = timezone.now()
        super(Visit, self).save(*args, **kwargs)

class Status(models.Model):
    visit = models.ForeignKey(Visit,on_delete=models.CASCADE)
    description = models.CharField(name="description",max_length=200)
    time = models.DateTimeField(null=True, blank=True)
    aproved = models.BooleanField(default=False)
    visit_complete = models.BooleanField(default=False)
    exit_time = models.DateTimeField(null=True, blank=True)
    date_created = models.DateTimeField(default=timezone.now, editable=False)

    def __str__(self):
        return self.visit.name

    def save(self, *args, **kwargs):
        if not self.id:
           self.date_created = timezone.now()
        super(Status, self).save(*args, **kwargs)
class VisitSerializers(serializers.ModelSerializer):
    class Meta:
       model = Visit
       fields = ('name','gender','mobile','email','address','visit_type','visit_purpose','visitor_photo','id_photo')


class StatusSerializers(serializers.ModelSerializer):
    visit = VisitSerializers(required=True)

    class Meta:
       model = Status
       fields = ('visit', 'description','time','aproved','visit_complete','exit_time')

    def create(self, validated_data):
       visit_data = validated_data.pop('visit')
       visit = VisitSerializers.create(VisitSerializers(), validated_data=visit_data)
       status, created =  StatusSerializers.objects.update_or_create(visit=visit,
                                description=validated_data.pop('description'))
    return status
@api_view(['GET', 'POST'])
def create_visitor(request):
   if request.method == 'GET':
      visitor = Visit.objects.all()
      serializer = VisitSerializers(visitor, many=True)
      return Response(serializer.data)
   elif request.method == 'POST':
     serializer = VisitSerializers(data=request.data)
     if serializer.is_valid(raise_exception=ValueError):
         serializer.create(validated_data=request.data)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
我发布的数据

  {
    "visit":{
       "name":"Alian",
       "gender": "M",
        "mobile":"97437000",
       "visit_type":"1",
      "visit_purpose":"vvvvvvv"
   },
   "description":"this is testing!!!!!"
 }
我得到的错误

{
"name": [
    "This field is required."
],
"gender": [
    "This field is required."
],
"visit_type": [
    "This field is required."
],
"visit_purpose": [
    "This field is required."
]
}


我遵循了本教程,但当我使用该代码时,它工作得非常好。但当我自定义它时,它不工作。

您使用的是
创建访问者
方法和
访问者
。所以你发布的数据应该是

{
    "name":"Alian",
    "gender": "M",
    "mobile":"97437000",
    "visit_type":"1",
    "visit_purpose":"vvvvvvv"
}
或者,如果您希望将数据发送为

{
    "visit":{
       "name":"Alian",
       "gender": "M",
       "mobile":"97437000",
       "visit_type":"1",
       "visit_purpose":"vvvvvvv"
    },
    "description":"this is testing!!!!!"
}
然后更改
POST
逻辑,如下所示

@api_view(['GET', 'POST'])
def create_visitor(request):
   if request.method == 'GET':
      visitor = Visit.objects.all()
      serializer = VisitSerializers(visitor, many=True)
      return Response(serializer.data)
   elif request.method == 'POST':
     serializer = VisitSerializers(data=request.data.get('visit')) # <-- here get visit object
     if serializer.is_valid(raise_exception=ValueError):
         serializer.create(validated_data=request.data)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
@api_视图(['GET','POST']))
def创建_访客(请求):
如果request.method==“GET”:
visitor=Visit.objects.all()
序列化程序=访问者序列化程序(访问者,多个=真)
返回响应(serializer.data)
elif request.method==“POST”:

serializer=VisitSerializers(data=request.data.get('visit'))#您正在使用
create\u visitor
方法和
VisitSerializers
。所以你发布的数据应该是

{
    "name":"Alian",
    "gender": "M",
    "mobile":"97437000",
    "visit_type":"1",
    "visit_purpose":"vvvvvvv"
}
或者,如果您希望将数据发送为

{
    "visit":{
       "name":"Alian",
       "gender": "M",
       "mobile":"97437000",
       "visit_type":"1",
       "visit_purpose":"vvvvvvv"
    },
    "description":"this is testing!!!!!"
}
然后更改
POST
逻辑,如下所示

@api_view(['GET', 'POST'])
def create_visitor(request):
   if request.method == 'GET':
      visitor = Visit.objects.all()
      serializer = VisitSerializers(visitor, many=True)
      return Response(serializer.data)
   elif request.method == 'POST':
     serializer = VisitSerializers(data=request.data.get('visit')) # <-- here get visit object
     if serializer.is_valid(raise_exception=ValueError):
         serializer.create(validated_data=request.data)
         return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.error_messages,
                     status=status.HTTP_400_BAD_REQUEST)
@api_视图(['GET','POST']))
def创建_访客(请求):
如果request.method==“GET”:
visitor=Visit.objects.all()
序列化程序=访问者序列化程序(访问者,多个=真)
返回响应(serializer.data)
elif request.method==“POST”:

serializer=VisitSerializers(data=request.data.get('visit'))#这可以通过不同的方法解决

您的VisiteSrializers与访问模型链接,您的VisiteSrializers应该是预期的

fields = ('name','gender','mobile','email','address',
'visit_type','visit_purpose','visitor_photo','id_photo')
但您只发送了两个字段

作为对象访问
。它包含姓名、性别、手机访问类型和访问目的。
说明
作为文本

但是您的访问者不了解
访问
描述
数据

1.如果您不想更改发送数据和接收数据的方式 因此,一种方法是从请求数据中提取必要的数据

visit\u serializer\u data=request.data.get('visit')

你会得到

{
“姓名”:“阿里安”,
“性别”:“M”,
“手机”:“97437000”,
“访问类型”:“1”,
“访问目的”:“VVV”
}

然后传递visit_序列化程序_数据


序列化程序=访问序列化程序(数据=访问\u序列化程序\u数据)
serializer.is\u有效(raise\u exception=True)
instance=serializer.save()
#在这里处理剩余的逻辑
....
...
2如果要更改传递的数据。 改为如下。因为您的VisitSerializer数据需要它们

{
“姓名”:“阿里安”,
“性别”:“M”,
“手机”:“97437000”,
“访问类型”:“1”,
“访问目的”:“VVV”
}
3您正在传递数据VisitSerializers将其更改为StatusSerializers(Data=request.Data)
您正在将数据发送到
VisiteSrializers
。查看您的
序列化程序
创建访问者
数据
。您需要使用
StatusSerializers
,而在
POST
方法中,这可以通过不同的方法解决

您的VisiteSrializers与访问模型链接,您的VisiteSrializers应该是预期的

fields = ('name','gender','mobile','email','address',
'visit_type','visit_purpose','visitor_photo','id_photo')
但您只发送了两个字段

作为对象访问
。它包含姓名、性别、手机访问类型和访问目的。
说明
作为文本

但是您的访问者不了解
访问
描述
数据

1.如果您不想更改发送数据和接收数据的方式 因此,一种方法是从请求数据中提取必要的数据

visit\u serializer\u data=request.data.get('visit')

你会得到

{
“姓名”:“阿里安”,
“性别”:“M”,
“手机”:“97437000”,
“访问类型”:“1”,
“访问目的”:“VVV”
}

然后传递visit_序列化程序_数据


序列化程序=访问序列化程序(数据=访问\u序列化程序\u数据)
serializer.is\u有效(raise\u exception=True)
instance=serializer.save()
#在这里处理剩余的逻辑
....
...
2如果要更改传递的数据。 改为如下。因为您的VisitSerializer数据需要它们

{
“姓名”:“阿里安”,
“性别”:“M”,
“手机”:“97437000”,
“访问类型”:“1”,
“访问目的”:“VVV”
}
3您正在传递数据VisitSerializers将其更改为StatusSerializers(Data=request.Data)
您正在将数据发送到
VisiteSrializers
。查看您的
序列化程序
创建访问者
数据
。在使用
POST
方法时,您需要使用
StatusSerializers
,我只是遵循了该教程。但是他们也传递了额外的数据(UnivStudent)模型。甚至我也尝试了该代码作为演示。检查序列化程序创建method@CliftonAvilD“Souza,在那篇文章中,用户数据pop像
user\u data=validated\u data.pop('user')
和从
validated\u data
传递的剩余
UnivStudent
数据。您创建了嵌套序列化程序
StatusSerializers
,但即使创建了它,您也没有使用它!我希望你能再读一次这篇文章。只传递访问我以前做过。但是如何将描述连同它一起传递到带有访问对象的状态表?我得到了错误
TypeError:“visit”是此函数的无效关键字参数
我已经更改了POST逻辑,如您所示@uedemircan您可以打印您的日志吗
request.data
并在此处共享?我只是遵循了该教程。但他们也传递了额外的数据(UnivStudent)模型。甚至我也尝试了