【问题标题】:djangorestframework user_id violates not-null constraintdjangorestframework user_id 违反非空约束
【发布时间】:2012-11-01 13:10:59
【问题描述】:

我这几天一直在看这个,现在要拔掉我的头发,所以任何帮助都将不胜感激。

我有一个名为 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 没有被调用,并且用户 ID 的映射没有发生。当我使用 api 登录并尝试推送新包时,出现错误。

我试图将它尽可能地映射到教程http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html,但没有任何运气。

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

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

非常感谢任何想法。

J

【问题讨论】:

  • 您能否在这个问题中补充一下您的视图是什么样的?如果您的REST_FRAMEWORK 设置字典中有任何内容,该怎么办?

标签: python django authentication django-rest-framework


【解决方案1】:

我有同样的问题...

您必须在帖子中使用序列化对象调用 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】:

你定义的方法pre_save(),它不是一个视图,它是一个模型方法,应该在对象包的实例被保存之前正确执行。发生的情况是 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',)

【讨论】:

    【解决方案3】:

    确保您的视图类继承了 CreateModelMixin 混合。

    正如doc 所说:

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

    【讨论】:

    • 你能展示代码的工作示例吗?就其本身而言,这并不能真正回答问题。
    猜你喜欢
    • 2018-09-12
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2016-01-18
    相关资源
    最近更新 更多