繁体   English   中英

django.db.utils.IntegrityError: NOT NULL 约束失败来自 Postman

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM