【问题标题】:Django Rest Framework 3.0 : IntegrityError Exception Value: (1048, "Column' cannot be null")Django Rest Framework 3.0:IntegrityError 异常值:(1048,“列'不能为空”)
【发布时间】:2016-05-04 07:57:15
【问题描述】:

我已经定义了模型如下

from django.db import models

# Create your models here.
    class Customer(models.Model):    
        cust_firstname=models.TextField(max_length=50)
        cust_lastname=models.TextField(max_length=50)
        cust_company=models.TextField(max_length=100)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        cust_contact_number = models.IntegerField()
        cust_email = models.TextField(max_length=100)
        cust_address=models.TextField(max_length=200,default=None)

        def __unicode__(self):
           return self.cust_firstname

    class Employee(models.Model):
        employee_firstname = models.TextField(max_length=50)
        employee_lastname = models.TextField(max_length=50)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        employee_contact_number = models.IntegerField()
        employee_email = models.TextField(max_length=100)
        employee_designation = models.TextField(max_length=50)
        employee_address=models.TextField(max_length=200, default=None)

    def __unicode__(self):
        return self.employee_firstname

    class ProjectDetails(models.Model): 
        customer = models.ForeignKey(Customer)
        employee=models.ForeignKey(Employee)
        project_name = models.TextField(max_length=50)
        project_startdate = models.DateField(auto_now=False, default=None)
        project_status = models.TextField(default="Initial")
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)

    def __unicode__(self):
        return self.project_name

而我的序列化器如下图

     from ProjectTemplate.models import Customer, Employee, ProjectDetails
     from rest_framework import serializers

       class CustomerSerializers(serializers.ModelSerializer):
         class Meta:
         model=Customer
         fields =   ('id','cust_firstname','cust_lastname','cust_company','created_at','updated_at','cust_contact_number','cust_email','cust_address')

    read_only_fields = ('created_at', 'updated_at')

       class EmployeeSerializer(serializers.ModelSerializer):
        class Meta:
         model=Employee
          fields =   ('id','employee_firstname','employee_lastname','created_at','updated_at','employee_contact_number','employee_email','employee_designation','employee_address')

    read_only_fields = ('created_at', 'updated_at')

class ProjectDetailsSerializer(serializers.ModelSerializer):
#customer = CustomerSerializers(read_only=True)
#employee = EmployeeSerializer(read_only=True)
    customer = serializers.SlugRelatedField(slug_field='cust_firstname', read_only=True)
    employee = serializers.SlugRelatedField(slug_field='employee_firstname', read_only=True)
class Meta:
        model = ProjectDetails
        fields =       ('id','project_name','project_startdate','created_at','updated_at','project_status','customer','employee')
        read_only_fields = ('created_at', 'updated_at')

我在视图中的 POST 方法是

    from django.http import Http404
    from ProjectTemplate.models import ProjectDetails, Customer, Employee
    from ProjectTemplate.serializers import ProjectDetailsSerializer,               CustomerSerializers, EmployeeSerializer
    from rest_framework.views import APIView
    from rest_framework.response import Response
    from rest_framework import status



class ProjectViewSet(viewsets.ModelViewSet):
    queryset = ProjectDetails.objects.all()
    serializer_class = ProjectDetailsSerializer


def perform_create(self, serializer):
    custid = self.request.data.get("customer_id")
    empid = self.request.data.get("employee_id")
    serializer.save(
        customer=Customer.objects.get(pk=custid),
        employee=Employee.objects.get(pk=empid))

def perform_update(self, serializer):       
    custid = self.request.data.get("customer_id")
    empid = self.request.data.get("employee_id")
    serializer.save(
        customer=Customer.objects.get(pk=custid),
        employee=Employee.objects.get(pk=empid))

def perform_destroy(self, instance):
        instance = self.get_object()
        instance.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

当我尝试发布请求时,我收到完整性错误。 代码不会保存对象,因为它没有获取 customer_id 外键值。请找到随附的屏幕截图。有人可以帮我知道序列化方法有什么问题吗?

【问题讨论】:

  • 我已经使用 Django rest framework 3.0 重命名了我
  • 您在此视图中发布什么数据?
  • JSON 请求我从 chrome postman 开发者工具发布它

标签: django python-2.7 django-rest-framework


【解决方案1】:

您收到此错误是因为当您保存 serializer 时,customeremployee 未在 instance 上设置。在serializer 本身上设置这些值根本不会产生任何影响。您必须在serializersave 方法中传递这些附加值。

另外,我建议您重写 perform_create 方法而不是 post 方法:

def perform_create(self, serializer):
    custid = self.request.data.get("customer_id")
    empid = self.request.data.get("employee_id")
    serializer.save(
        customer=Customer.objects.get(pk=custid),
        employee=Employee.objects.get(pk=empid)
    )

这是直接来自documentation

mixin 类提供以下方法,并提供对象保存或删除行为的简单覆盖

  • perform_create(self, serializer) - 在保存新对象实例时由 CreateModelMixin 调用。

更新关于使用ModelViewSet

您不需要使用APIView,但您可以将ModelViewSet 用于不同的操作,例如listretrievecreate

class ProjectViewSet(viewsets.ModelViewSet):

    queryset = ProjectDetails.objects.all()
    serializer_class = ProjectDetailsSerializer

    # now you can add your perform_create here
    def perform_create(self, serializer):
        custid = self.request.data.get("customer_id")
        empid = self.request.data.get("employee_id")
        serializer.save(
            customer=Customer.objects.get(pk=custid),
            employee=Employee.objects.get(pk=empid)
        )

【讨论】:

    猜你喜欢
    • 2016-09-06
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    • 2016-02-24
    相关资源
    最近更新 更多