首页 > 解决方案 > (1048,“列 'user_id' 不能为空”)与 Django DRF

问题描述

我编写了代码以通过 POST 和 DRF(Django Rest Framework)成功创建新用户,并且我可以正确获取令牌,但是当我尝试 POST(通过 DRF)填充链接到该用户的配置文件时,我得到(1048,“Column 'user_id ' 不能为空")

This is snippets of my code:
for serializers:
class UserSerializer(ModelSerializer):
    class Meta:
        model = User
        fields = ('username','email','first_name','last_name','password')
    def create(self, *args, **kwargs):
        user = super().create(*args, **kwargs)
        p = user.password
        user.set_password(p)
        user.save()
        return user

    def update(self, *args, **kwargs):
        user = super().update(*args, **kwargs)
        p = user.password
        user.set_password(p)

        user.save()
        return user

class ProfileSerializer(ModelSerializer):
    class Meta:
        model = Profile
       
        fields = ('bio','birth_date','location','country')

    def create(self, *args, **kwargs):
        profile = super().create(*args, **kwargs)
        profile.save()
        return profile
    
    def update(self, *args, **kwargs):
        profile = super().update(*args, **kwargs)
        profile.save()
        return profile

and for views:
class ProfileViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    permission_classes = IsAuthenticated,
    serializer_class = ProfileSerializer
    queryset = Profile.objects.all()


class UserViewSet(viewsets.GenericViewSet,mixins.CreateModelMixin,):
    """
    API endpoint that allows users to be viewed or edited.
    """
    #permission_classes= (IsAdminUser,)
    serializer_class = UserSerializer
    queryset = User.objects.all().order_by('-date_joined')

and for models:
@receiver(post_save, sender = settings.AUTH_USER_MODEL)
def create_auth_token(sender,instance=None,created=False, **kwargs):
    if created:
        Token.objects.create(user=instance)


class Country(models.Model):
    iso = models.CharField(max_length = 2,unique = True)
    name = models.CharField(max_length = 250)
    iso3 = models.CharField(max_length = 6)
    phonecode = models.CharField(max_length=6)
    def __unicode__(self):
        return '%s' % self.name
    def __str__(self):
        return '%s' % self.name

class Profile(models.Model):
    #user = models.OneToOneField(User, on_delete=models.CASCADE,default = "")
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE,default = "")
    bio = models.TextField(max_length=100, blank=True)
    birth_date = models.DateField(null=True, blank=True)
    location = models.CharField(max_length=254, blank=True)
    country = models.ForeignKey(Country,on_delete=models.CASCADE,blank=True,null=True)
    def __unicode__(self):
        return '%s' % self.user
    def __str__(self):
        return '%s' % self.user

@receiver(post_save, sender=User)
def update_user_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
    instance.profile.save()

当我尝试使用 Postman 并通过令牌进行令牌身份验证时,它可以正确识别令牌但我收到此错误:(1048,“列 'user_id' 不能为空”)与 Django DRF 我感谢您帮助解决这个问题

标签: djangodjango-rest-framework

解决方案


create() 保存到数据库,所以调用函数前需要设置profile.user_id。


推荐阅读