djangorestframework user_id违反非空约束

时间:2012-11-13 03:17:04

标签: python django authentication django-rest-framework

我现在已经看了好几天了,我正在拔头发,所以任何帮助都会受到赞赏。

我有一个名为package的简单模型,它有一个userFrom和userTo

class Package(models.Model):

  title = models.CharField(max_length=50)
  packageid = models.CharField(primary_key=True, max_length=64, default=uuid_str, editable=False)
  userfrom  = models.ForeignKey('auth.user', editable=False, related_name='userfrom')
  userto  = models.ForeignKey('auth.user', editable=False, related_name='userto')

我的包的视图有以下内容来分配映射

 def pre_save(self, obj):
    print "adding user to object! %s "%self.request.user
    obj.userfrom = self.request.user

似乎没有调用pre_save并且没有发生userid的映射。当我使用api登录并尝试推送新软件包时,我收到错误。

我试图尽可能地将这一点与教程http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html紧密相关,但没有任何运气。

异常类型:IntegrityError 例外价值:
“userfrom_id”列中的空值违反非空约束

浏览源代码到sql我可以看到userfrom_id和userto_id都是null。

任何想法都非常感激。

Ĵ

3 个答案:

答案 0 :(得分:3)

你定义的方法pre_save(),它不是一个视图,它是一个Model方法,应该在对象的一个​​实例打算保存之前执行。发生的事情是pre_save不知道变量“request”的值,因为这种变量存在于视图函数环境中而不是模型环境中。你混淆了事情。

我认为你需要这样的东西:

# views.py
def your_view(request):

    if request.method == 'POST':
        package_form = PackageForm(request.POST)
        if package_form.is_valid():
            package = package_form.save(commit=False)
            package.userfrom = request.user
            package.save()

            return render(request, 
                'your_template.html', {}
            )
    package_form = PackageForm()
    return render(request, 
                'another_template.html', {}
            )

那就是观点。你需要一个像这样的表格:

class PackageForm(forms.ModelForm):
    class Meta:
        model = Package
        exclude = ('userfrom',)

答案 1 :(得分:3)

我有同样的问题......

您必须使用序列化对象调用帖子中的pre_save:

def post(self, request, format=None):
    serializer = SnippetSerializer(data=request.DATA)
    if serializer.is_valid():
        self.pre_save(serializer.object) #pass in serializer.object
        serializer.save()

答案 2 :(得分:0)

确保您的视图类继承 CreateModelMixin mixin。

正如doc所述:

  

请记住,GenericAPIView本身并不调用pre_save()方法,但是CreateModelMixin和UpdateModelMixin类上的create()和update()方法调用它。