2

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

我有一个名为 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 都是空的。

任何想法都非常感谢。

Ĵ

4

3 回答 3

3

您定义的 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',)
于 2012-11-13T03:53:07.417 回答
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()
于 2012-11-14T04:26:14.690 回答
0

确保你的视图类继承了CreateModelMixin mixin。

正如文档所述:

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.

于 2013-12-11T18:23:58.640 回答