首页 > 解决方案 > 如何在 django-rest-framework 中检查数据库中是否存在数据

问题描述

如何检查数据库中是否存在数据,如果数据不存在则创建或返回。我使用了 get_or_create() 但不知何故我得到了错误

NOT NULL 约束处​​的 IntegrityError 失败

模型类

class UserMobileDevice(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE
    )
    token = models.CharField(max_length=255)
    device_model = models.CharField(max_length=255)
    os = models.CharField(max_length=255)
    os_version = models.IntegerField(null=True)
    build_version = models.CharField(max_length=255, null=True)
    manufacturer = models.CharField(max_length=255, null=True)
    device = models.CharField(max_length=255, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

序列化器类

class UserMobileSerializer(serializers.ModelSerializer):
    #user = serializers.StringRelatedField()
    class Meta:
        model = models.UserMobileDevice
        fields = '__all__'
        read_only_fields = ('id',)

    def create(self, validated_data):
        user, created = models.UserMobileDevice.objects.get_or_create(
            token=validated_data.get('token', None),
            defaults={'token': validated_data.get('token',None),'os':validated_data.get('os',None),'device_model':validated_data.get('device_model',None),'os_version':validated_data.get('os_version',None),'build_version':validated_data.get('build_version',None),'manufacturer':validated_data.get('manufacturer',None),'device':validated_data.get('device',None)})
        return user

查看课程

class UserMobileViewSet(viewsets.ModelViewSet):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    queryset = UserMobileDevice.objects.all()
    serializer_class = UserMobileSerializer

    def get_queryset(self):
        return self.queryset.filter(user=self.request.user)

我不太确定为什么会收到以下错误。任何帮助将不胜感激!

标签: python-3.xdjango-rest-framework

解决方案


你可以在你的序列化器中尝试这样的事情:

class UserMobileSerializer(serializers.ModelSerializer):
    #user = serializers.StringRelatedField()
    class Meta:
        model = models.UserMobileDevice
        fields = '__all__'
        read_only_fields = ('id', 'user')

    def create(self, validated_data):
        instance, created = self.Meta.model.objects.get_or_create(**validated_data)
        if not created:
            raise ValidationError('instance alreaady exists..')
        return instance

在您看来:

class UserMobileViewSet(viewsets.ModelViewSet):
    authentication_classe(authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    queryset = UserMobileDevice.objects.all()
    serializer_class = UserMobileSerializer

    def get_queryset(self):
        return self.queryset.filter(user=self.request.user)

    def perform_create(self, serializer):
        user = self.request.user
        serializer.save(user=user)

推荐阅读