【问题标题】:NOT NULL constraint failed: accounts_personalcolor.user_idNOT NULL 约束失败:accounts_personalcolor.user_id
【发布时间】:2021-11-16 03:47:53
【问题描述】:

我是 Django 新手,无法为发布创建 django-rest-framework API,继承 APIView。我正在使用一个序列化程序,它继承了 djangos ModelSerializer。每当我尝试保存序列化程序或模型对象时,我都会遇到 NOT NULL constraint failed:accounts_personalcolor.user_id 错误。

color.js 使用 Django rest 框架发布图像,如下所示。

function PersonalColorScreen({navigation,route}) {
    const {image} = route.params;
    console.log('uri is', image.uri);
    const [userToken, setUserToken] = React.useState(route.params?.userToken);

    const requestHeaders = {
        headers: {
            "Content-Type": "multipart/form-data"
        }
    }
    // helper function: generate a new file from base64 String
    //convert base64 image data to file object to pass it onto imagefield of serializer.
    //otherwise, serializer outputs 500 Internal server error code

    const dataURLtoFile = (dataurl, filename) => {
    const arr = dataurl.split(',')
    const mime = arr[0].match(/:(.*?);/)[1]
    const bstr = atob(arr[1])
    let n = bstr.length
    const u8arr = new Uint8Array(n)
    while (n) {
      u8arr[n - 1] = bstr.charCodeAt(n - 1)
      n -= 1 // to make eslint happy
    }
    return new File([u8arr], filename, { type: mime })
  }
  //random number between 0-9
  function getRandomInt(max) {
    return Math.floor(Math.random() * max);
  }
  
  // generate file from base64 string
  const file = dataURLtoFile(image.uri, `${getRandomInt(10)}.png`)
  const formData= new FormData();
  formData.append('img',file,file.name);

  console.log(file.name);
    //axios post request to send data
    // axios.post('http://localhost:8000/accounts/personalcolor/',  formData,requestHeaders)
    //multipartparser
    axios.post('http://localhost:8000/accounts/personalcolor/', formData, requestHeaders)
    .then(res => {
        console.log(res);
        if (res.data === 'upload another image') {
            setimageError('upload another image');
        } else {
            // signUp(userToken);
            let color;
            switch (res.data){
                case ('spring'):
                    color = 'spring';
                    break;
                case ('summer'):
                    color = 'summer';
                    break;
                case ('fall'):
                    color = 'fall';
                    break;
                case ('winter'):
                    color = 'winter';
                    break;
            }
        }
        })
    .catch(err => {
        console.error(err.response.data)
    })

view.py 处理发布的图像。我尝试了#1,但它没有用。所以我尝试了 #2 或 #3,但它们返回相同的错误,说 NOT NULL constraint failed: accounts_personalcolor.user_id. 我认为保存序列化程序或模型对象会自动创建 id(Autofield) 而我没有'不明白为什么我会遇到这个错误。

views.py

@api_view(['POST'])
def personalcolor(request):

    # 1
    image=request.FILES['img']
    personal_color=Personalcolor()
    personal_color.img=image
    personal_color.save()

    # 2
    image=request.FILES['img']
    personal_color=Personalcolor.objects.create(img=image)
    personal_color.save()

    # 3
    serializer = ColorSerializer(data=request.data)
    # validation of input data
    if serializer.is_valid():
        serializer.save()
    else:
        return Response(serializer.errors, status = status.HTTP_400_BAD_REQUEST)

模型.py

class Personalcolor(models.Model):
    objects = models.Manager()
    img = models.ImageField('personal_img',upload_to="personalcolor/", blank=True)

serializer.py

class ColorSerializer(serializers.ModelSerializer):
   class Meta:
      model = Personalcolor
      fields = ['img']

如上所述,执行代码返回 django.db.utils.IntegrityError: NOT NULL constraint failed: accounts_personalcolor.user_id。 任何帮助将不胜感激。

【问题讨论】:

  • Personalcolor 模型似乎有一个 user 字段。此错误意味着它缺少此字段的值

标签: reactjs django django-rest-framework axios django-serializer


【解决方案1】:

在您的 img 字段中将 null 设置为 true,例如:

img = models.ImageField('personal_img',upload_to="personalcolor/", blank=True, null=True)

然后在 Personalcolor 模型所在应用程序的迁移文件夹中,删除所有看起来像 000*_initial.py 的文件

然后运行 ​​makemigrations 并迁移

【讨论】:

  • 我完全按照说明进行操作,但我看到了同样的错误..
  • 如果您将 db.sqlite3 文件用作数据库并且不介意丢失数据库中的内容,则可能需要删除该文件。然后重复上述步骤。
  • 它有效。非常感谢!
猜你喜欢
  • 2015-04-22
  • 2018-08-24
  • 2022-01-19
  • 2020-12-18
  • 2021-03-20
  • 2020-02-11
  • 2019-02-13
  • 2017-12-31
  • 2019-05-06
相关资源
最近更新 更多