django.db.utils.IntegrityError: NOT NULL constraint failed f



我正在尝试使用Django rest框架创建一个简单的外键模型。这些是模型:

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)

这是每个模型的序列化器:

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)

我想这样发送邮递员的请求:

{
"place_origin": 3
}

但是我从标题中得到错误。谢谢你的帮助!

错误是您试图通过PlaceSerializer发送数据,但此字段是read_only。另一方面,您的DB期望place_origin,因为您在模型中精确指定了null=False。两者结合会产生错误"Not NULL constraint failed"。

最简单的方法是稍微修改序列化器,使一个字段用于写,另一个字段用于读。

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"]

在这里,你将使用位置字段来创建与你的Route实例的关系。

最新更新