![](/img/trans.png)
[英]Createsuperuser django.db.utils.IntegrityError: NOT NULL constraint failed
[英]django.db.utils.IntegrityError: NOT NULL constraint failed fom Postman
我正在尝试使用 Django rest 框架创建一个带有外键的简单 model 。 这是模型:
class Route(models.Model):
place_origin = models.ForeignKey(
Place, null=False, on_delete=models.DO_NOTHING)
class Place(models.Model):
name = models.CharField(max_length=50, null=False)
这是每个 model 的串行器:
class PlaceSerializer(serializers.ModelSerializer):
class Meta:
model = Place
fields = ["id", "name"]
class RouteSerializer(serializers.ModelSerializer):
place_origin = PlaceSerializer(many=False, read_only=True)
class Meta:
model = Route
fields = ["id", "place_origin"]
此 RouteSerializer 具有 place_origin 属性,以便在我查看路线详细信息时显示地点详细信息(其中的所有字段)。 我的意思是我想显示的路线:
[
{
"id": 1,
"place_origin": {
"id": 1,
"name": "New york"
}
},
{
"id": 2,
"place_origin": {
"id": 2,
"name": "Boston"
}
}
]
而不仅仅是:
[
{
"id": 1,
"place_origin": 1
},
{
"id": 2,
"place_origin": 2
}
]
这是视图:
@api_view(['POST'])
def routes_new_route_view(request):
"""
Create a new route
"""
if request.method == "POST":
data = JSONParser().parse(request)
place_origin = Place.objects.get(id=data["place_origin"])
data["place_origin"] = PlaceSerializer(place_origin)
data["place_origin"] = data["place_origin"].data
serializer = RouteSerializer(data=data)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data, status=201)
else:
return JsonResponse(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
我想以这种方式发送来自 postman 的请求:
{
"place_origin": 3
}
但是我从标题中得到了错误。 感谢所有的帮助!
错误是您尝试通过 PlaceSerializer 发送数据,但此字段是只读的。 另一方面,您的数据库需要 place_origin,因为您在 model 中精确设置了 null=False。 两者结合都会给出错误“Not NULL 约束失败”。
最简单的方法是稍微修改您的序列化程序,以便有一个用于写入的字段和另一个用于读取的字段。
class RouteSerializer(serializers.ModelSerializer):
place_origin = PlaceSerializer(many=False, read_only=True)
place = serializers.PrimaryKeyRelatedField(source="place_origin",queryset=Place.objects.all(),write_only=True)
class Meta:
model = Route
fields = ["id", "place_origin", "place"]
在这里,您将使用 place 字段作为与您的 Route 实例创建关系的一种方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.