【问题标题】:Integrity Error: NOT NULL constraint failed: users_profile.user_id完整性错误:NOT NULL 约束失败:users_profile.user_id
【发布时间】:2020-08-22 09:34:32
【问题描述】:

我想在 django rest 框架中实现更新用户配置文件。 无论我尝试如何更改代码,我都会收到上述错误。 下面是我的用户序列化程序、用户模型和 api 视图的代码。

users/api/serializers.py:

from rest_framework import serializers
from ..models import User,Profile



class UserSerializer(serializers.ModelSerializer):

   

    class Meta:
        model = User
        fields = ('username','first_name','last_name','phone','id')




class UserProfileSerializer(serializers.ModelSerializer):

   

    user = UserSerializer(read_only=True)

    class Meta:
        model = Profile
        fields = ('user', 'bio', 'image')



    def update(self,instance,validated_data):
        user_data = validated_data.pop('user',{})
        user = instance.user
        instance.bio = validated_data.get('bio',instance.bio)
        instance.image = validated_data.get('image',instance.image)
        instance.save()
        return instance

Is there anything wrong in my serializer, cause I tried hardcoding and saving a particular user profile also by using for ex: instance.user.id = 21 and then saving it, but i get the same error

我的序列化程序有什么问题吗,因为我尝试使用 for ex: instance.user.id = 21 硬编码和保存特定的用户配置文件,然后保存它,但我得到了同样的错误

users/models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser, BaseUserManager
from django.conf import settings
import os
import random
import string



class MyAccountManager(BaseUserManager):

    def create_user(self,phone,username,first_name,last_name):
        if not phone:
            raise ValueError("Users must have a valid phone number")
        if not username:
            raise ValueError("Users must have a valid username")
        if not first_name:
            raise ValueError("Users must have a valid First Name")
        if not last_name:
            raise ValueError("Users must have a valid last name")


        user = self.model(
            phone=phone,
            username=username,
            first_name=first_name,
            last_name=last_name

        )

        user.save(using=self._db)
        return user

    def create_superuser(self,username,phone,first_name,last_name,password = None):
        user = self.create_user(
               username=username,
               phone=phone,
               first_name=first_name,
               last_name=last_name,
        )
        user.set_password(password)
        user.is_admin=True
        user.is_staff=True
        user.is_superuser=True

        user.save(using=self._db)

        return user


class User(AbstractBaseUser):
    phone = models.CharField(unique=True,max_length=20)
    username = models.CharField(max_length=50,unique=True)
    first_name = models.CharField(max_length=40)
    last_name = models.CharField(max_length=30, blank=True)
    date_joined = models.DateTimeField(verbose_name='date_joined', auto_now_add=True)
    last_login = models.DateTimeField(verbose_name='last_login', auto_now_add=True)
    is_admin = models.BooleanField(default=False)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    otp = models.CharField(max_length=10,default='')


    USERNAME_FIELD = 'phone'
    REQUIRED_FIELDS = ['username','first_name','last_name']


    objects = MyAccountManager()



    def __str__(self):
        return self.username


    def has_perm(self,perm,obj = None):
        return self.is_admin

    def has_module_perms(self,app_label):
        return True



class Profile(models.Model):
    user = models.OneToOneField(User,on_delete = models.CASCADE)
    bio = models.CharField(max_length=140)
    image = models.ImageField(default='default.jpg',upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username}'

users/api/views.py

from rest_framework import status
from rest_framework.response import Response
from rest_framework import viewsets
from rest_framework.views import APIView
from .serializers import UserSerializer,UserProfileSerializer
from ..models import User,Profile
from django_filters.rest_framework import DjangoFilterBackend

class ProfileViewset(viewsets.ModelViewSet):
    model = Profile
    serializer_class = UserProfileSerializer
    queryset = Profile.objects.all()
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['user']

【问题讨论】:

  • 请从您的字段中删除id。像这样。 id 会自动保存而不是覆盖。 class UserSerializer(serializers.ModelSerializer): class Meta: model = User fields = ('username','first_name','last_name','phone')
  • 好的!会做的。
  • 但是删除了id,仍然没有解决问题,我得到了同样的错误。
  • 有人帮我解决这个问题....
  • 此链接可能会有所帮助stackoverflow.com/questions/63546367/…

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


【解决方案1】:

如果要插入空值,请添加null=True。这是我的建议

class Profile(models.Model):
    user = models.OneToOneField(User,null=True,on_delete = models.CASCADE)
    bio = models.CharField(max_length=140)
    image = models.ImageField(default='default.jpg',upload_to='profile_pics')

    def __str__(self):
        return f'{self.user.username}'

【讨论】:

  • 谢谢!但我不希望用户数据在那里为空,是的,它解决了错误,但我不希望用户信息为空。
  • 如果用户数据存在,是否需要更新它,否则新插入??
  • 不,我只是想更新一个现有的用户资料,不接触用户数据,只允许更新个人资料和图像
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2015-08-10
  • 2020-06-08
  • 2023-02-20
  • 1970-01-01
  • 2018-03-20
  • 2019-07-27
相关资源
最近更新 更多