2013-08-28 45 views
0

这是我的models.pyDjango的IntegrityError:(1048, “列user_ID的”不能为空“)

class Cfituser(models.Model): 
user = models.OneToOneField(User) 
socialid = models.IntegerField(null=True) 
accesstoken = models.CharField(max_length=255L, null = True) 
class Meta: 
    db_table = 'CfitUser' 
def __str__(self): 
     return "%s's profile" % self.user 

@receiver(post_save, sender=User) 
def create_cfituser(sender, instance, created, **kwargs): 
    if created: 
     Cfituser.objects.get_or_create(user=instance) 

这是我的views.py

@api_view(['GET', 'POST']) 
def users_create(request, format = None): 
""" 
List all users, or create a new user. 
""" 
if request.method == 'GET': 
    cfituser = Cfituser.objects.all() 
    serializer = CfituserSerializer(cfituser, many=True) 
    return Response(serializer.data) 

elif request.method == 'POST': 
    serializer = CfituserSerializer(data=request.DATA) 
    if serializer.is_valid(): 
      print serializer.data 
      user = User.objects.create_user(username = serializer.data['socialid']) 
      cfituser = Cfituser.objects.get(user = user) 
      cfituser.accesstoken = serializer.data['accesstoken'] 
      cfituser.socialid = serializer.data['socialid'] 
      cfituser.save() 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

每当有HTTP发布请求后,我的数据库表格按预期填充,但此错误不断弹出。我尝试了几乎所有可用的解决方案,但我坚持这一点。

我试过user = models.OneToOneField(User, null = True),但是这导致我的数据库表中有两个条目,一个是user_id = NULL,另一个是user_id = actualvalue

有关如何解决此问题的任何建议?

+0

您的线路'cfituser = Cfituser.objects.get(user = user)cfituser.user = user'完全错误 – suhailvs

+0

@suhail对不起cfit.user = user被注释掉。这不是我的代码的一部分。 – geekchic

回答

1

保存在默认情况下承诺的进入到数据库中,以防止这种情况,通过对commit=Falsesave(),然后做你的自定义设置。

serializer = serializer.save(commit=False) 

user, created = User.objects.get_or_create(username = serializer.socialid) 
cfituser, created = Cfituser.objects.get_or_create(user = user) 
# cfituser.user = user This line is unnecessary 
cfituser.accesstoken = serializer.accesstoken 
cfituser.socialid = serializer.socialid 

cfituser.save() 
serializer.save() 

您也在重复您的努力,因为您的信号也会尝试创建用户。如果您使用的是django 1.5,请使用customized user model;和社会登记/ oauth,请使用django-social-auth

+0

'save()得到了一个意想不到的关键字参数'commit''。不幸的是,REST框架不支持。我正在查看定制的用户模型。 – geekchic

0

OneToOneField意味着,在Cfituser.user关系的反面将直接返回一个对象(user.cfituser给出Cfituser)。 SO Cfituser.user在表格中必须是唯一的(只有一个)。

class Cfituser(models.Model): 
    user = models.OneToOneField(User) 
    socialid = models.IntegerField(null=True) 
    accesstoken = models.CharField(max_length=255L, null = True) 
    def __unicode__(self): 
     return "%s's profile" % self.user.username 


def users_create(request, format = None): 
""" 
List all users, or create a new user. 
""" 
    if request.method == 'GET': 
     cfituser = Cfituser.objects.all() 
     serializer = CfituserSerializer(cfituser, many=True) 
     return Response(serializer.data) 
    elif request.method == 'POST': 
     serializer = CfituserSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      print serializer.data 
      user = User.objects.create_user(username = serializer.data['socialid'])     
      Cfituser(user = user,accesstoken = serializer.data['accesstoken'],socialid = serializer.data['socialid']).save() 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
    else: 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
+0

这引发了一个'IntegrityError:(1062,“'user_id''''''')' – geekchic

+0

@Nikhita你为什么使用'user = models.OneToOneField(User)',尝试'user = models.ForeignKey用户)' – suhailvs

+0

@Nikhita如果您使用'user = models.OneToOneField(User)',则可以使用'user.cfituser',其中'user'为'User'字段 – suhailvs

相关问题