【问题标题】:Integrity Error: NOT NULL constraint failed完整性错误:NOT NULL 约束失败 - Django Rest Framework
【发布时间】:2021-06-10 13:15:36
【问题描述】:

models.py

class tournament(models.Model):
    tournament_id = models.AutoField(primary_key=True)
    title = models.CharField(max_length=60)
    organizer = models.ForeignKey(
        client, null=False, blank=False, on_delete=models.CASCADE)
    logo = models.ImageField(null=True, blank=False)
    game = models.CharField(max_length=20, choices=GAMES)
    fees = models.IntegerField()

    def __str__(self):
        return self.title

views.py

# tournament

@api_view(['GET'])
def tournamentList(request):
    tournaments = tournament.objects.all()
    serializer = tournamentSerializer(tournaments, many=True)
    return Response(serializer.data)


@api_view(['GET'])
def tournamentDetail(request, tournamentId):
    singleTournament = tournament.objects.get(tournament_id=tournamentId)
    serializer = tournamentSerializer(singleTournament, many=False)
    return Response(serializer.data)


@api_view(['POST'])
def tournamentCreate(request):
    serializer = tournamentSerializer(data=request.data)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)


@api_view(['POST'])
def tournamentUpdate(request, tournamentId):
    singleTournament = tournament.objects.get(tournament_id=tournamentId)
    serializer = tournamentSerializer(
        instance=singleTournament, data=request.data)

    if serializer.is_valid():
        serializer.save()

    return Response(serializer.data)


@api_view(['DELETE'])
def tournamentDelete(request, tournamentId):
    singleTournament = tournament.objects.get(tournament_id=tournamentId)
    singleTournament.delete()

    return Response("Deleted Item")

serializers.py

class tournamentSerializer(serializers.ModelSerializer):
    organizer = clientSerializer(many=False, read_only=False)

    class Meta:
        model = tournament
        fields = "__all__"

    def create(self, validated_data):
        organizer_data = validated_data.pop('organizer')
        new_tournament = tournament.objects.create(**validated_data)
        client.objects.create(organizer_data)
        return new_tournament

我在锦标赛序列化程序中创建了 cusotm 创建字段 来创建 和更新 嵌套字段, 尝试使该工作很长时间,但无法摆脱错误。

当我尝试在 比赛更新 上发布数据时,错误提示为

NOT NULL constraint failed: api_tournament.organizer_id

这里 api 是应用程序的名称。

欢迎任何解决此问题的建议和代码重构以实现最佳实践

【问题讨论】:

  • 请编辑您的问题以使其更加关注。删除所有不必要的代码。如果您只对 tournamentUpdate 调用引发的错误感兴趣,我们为什么要阅读所有其他 api 视图代码?
  • 感谢您的建议,我删除了不必要的代码。

标签: django django-models serialization django-rest-framework django-views


【解决方案1】:
  1. “我在锦标赛序列化程序中创建了 cusotm create field 来创建和更新嵌套字段,试图让它工作很长时间,但无法摆脱错误。”

此错误与创建/更新嵌套字段无关。但如果你真的走那条路:

当您使用实例初始化序列化程序并调用 save() 时,它不会调用 create 方法。它将调用序列化程序更新方法。这是证明的源代码。

        if self.instance is not None:
            self.instance = self.update(self.instance, validated_data)
            assert self.instance is not None, (
                '`update()` did not return an object instance.'
            )
        else:
            self.instance = self.create(validated_data)
            assert self.instance is not None, (
                '`create()` did not return an object instance.'
            )

        return self.instance

但序列化程序更新方法似乎不在您提供的代码中。它将默认为 ModelSerializer 的更新,这会引发有关嵌套写入的错误。由于这不是发生的事情,因此错误必须更早。这可能发生在 serializer.is_valid() 内部。

  1. “当我尝试发布有关锦标赛更新的数据时,它给出的错误为

NOT NULL constraint failed: api_tournament.organizer_id "

错误表示违反了防止空值的约束。从外观上看,request.data 可能没有“organizer_id”或“organizer”键。如果您想更新锦标赛而不在更新期间发布所有数据,请提供序列化器字段参数 required=False 或使用参数 partial=True 初始化序列化器

【讨论】:

  • “request.data 可能没有“organizer_id”或“organizer”键”,没有像 organizer id 这样的字段,并且, “所需的序列化器字段参数=False 或使用参数 partial=True 初始化序列化器”,这不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多