Djangorestframework用户标识违反了notnull约束

2024-06-02 08:34:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经看了这几天了,我正准备把头发拔出来,任何帮助都将不胜感激。在

我有一个名为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')

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

^{pr2}$

然而,似乎pre_save没有被调用,userid的映射也没有发生。当我使用api登录并尝试推送新包时,我得到了错误。在

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

异常类型:IntegrityError 异常值:
“userfrom_id”列中的null值违反了not null约束

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

任何想法都很感激。在

J


Tags: nameauthidfalsemodelsnulllengthmax
3条回答

我也有同样的问题。。。在

您必须在post中使用序列化对象调用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()

确保视图类继承CreateModelMixinmixin。在

正如doc所述:

Remember that the pre_save() method is not called by GenericAPIView itself, but it is called by create() and update() methods on the CreateModelMixin and UpdateModelMixin classes.

您定义的方法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', {}
            )

这就是观点。你需要这样的表格:

^{pr2}$

相关问题 更多 >