我正在做一个血液分析实验室可用性检查项目,我使用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值来覆盖它。
2条答案
按热度按时间dpiehjr41#
编辑这里是序列化器中相关的OrderSerializer。pyfile:
类OrderSerializer(序列化器。ModelSerializer):# exams = ExamSerializer(many= 0,read_only =1)只需删除此行
j7dteeu82#
考虑使用
OneToOneField
而不是ForeignKey
来处理一对一关系。此外,最好将字段命名为exam
,因为它是一对一关系,并使用exam_order
作为反向关系的related_name,以访问检查示例文档中的顺序。关于手头的问题,在序列化程序中,您已经将
exams
字段设置为只读字段。但是,由于模型中有空约束,因此需要使其可写以避免此约束。您可以通过删除read_only=0
参数或将其设置为False来将其更改为可写字段。