Django Rest Framework的嵌套序列化程序POST请求外键错误

ivqmmu1c  于 2023-05-01  发布在  Go
关注(0)|答案(2)|浏览(205)

我正在做一个血液分析实验室可用性检查项目,我使用DRF(Django Rest Framework)来构建API。
每当我尝试发布包含OneToOne关系(ForeignKey)的数据时,都会遇到Not Null Constraints问题。
这里是我的模型中的关注模型。pyfile:

class Exam(models.Model):
    name = models.CharField(max_length=100,unique=True,blank=False)
    abbrv = models.CharField(max_length=100,unique=True,blank=False,null=False)
    price = models.IntegerField(blank=False,null=False)
    description = models.TextField(max_length=1000,blank=False,null=False)
    available = models.BooleanField(blank=False,null=False,default=True)
    _type = models.CharField(max_length=64,blank=False,null=False)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.abbrv



class Order(models.Model):
    patient = models.CharField(max_length=100,blank=False)
    code = models.CharField(max_length=100,unique=True,blank=False,null=False)
    total = models.IntegerField(blank=False,null=False)
    done = models.BooleanField(blank=False,null=False,default=True)
    exams =  models.ForeignKey(Exam, on_delete=models.CASCADE,related_name='ordered_exams')
    ordered_at = models.DateTimeField(auto_now_add=True)

下面是我的序列化器中的相关序列化器。pyfile:

class ExamSerializer(serializers.ModelSerializer):
    class Meta:
        model = Exam
        fields = '__all__'


class OrderSerializer(serializers.ModelSerializer):
    exams = ExamSerializer(many=0,read_only=1)
    
    class Meta:
        model = Order
        fields = '__all__'

以下是我在看来所关注的观点。pyfile:

class OrdersView(APIView):
    def get(self, request):
        order = Order.objects.all()
        serializer = OrderSerializer(order, many=True)
        return Response(serializer.data)

    def post(self,request):
        serializer = OrderSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

下面是从GET请求返回的可用考试:

[
  {
    "id": 1,
    "name": "fns",
    "abbrv": "fns",
    "price": 500,
    "description": "Formule et Numerisation Sanguine",
    "available": true,
    "_type": "hemo",
    "created_at": "2023-04-26T14:16:13.301701Z"
  }
]

每当我发送一个带有这个JSON对象的POST请求时:

{
  "patient":"kimanxo",
  "code":313,
  "total":9500,
  "exams":1
}

我得到这个错误:django.db.utils.IntegrityError:NOT NULL约束失败:API_order. examples_id.
我尝试将默认值设置为顺序。examines字段,它可以工作,但所有订单都放置在同一个exam(默认值)下,并且我无法通过在每个POST请求的JSON对象上指定examinesid值来覆盖它。

dpiehjr4

dpiehjr41#

编辑这里是序列化器中相关的OrderSerializer。pyfile:
类OrderSerializer(序列化器。ModelSerializer):# exams = ExamSerializer(many= 0,read_only =1)只需删除此行

class Meta:
    model = Order
    fields = '__all__'

# Use this to_representation to show the exam detail
def to_representation(self, instance):
    data = super().to_representation(instance)
    data['exams'] = ExamSerializer(instance.exams).data
    return data
j7dteeu8

j7dteeu82#

考虑使用OneToOneField而不是ForeignKey来处理一对一关系。此外,最好将字段命名为exam,因为它是一对一关系,并使用exam_order作为反向关系的related_name,以访问检查示例文档中的顺序。
关于手头的问题,在序列化程序中,您已经将exams字段设置为只读字段。但是,由于模型中有空约束,因此需要使其可写以避免此约束。您可以通过删除read_only=0参数或将其设置为False来将其更改为可写字段。

相关问题