2012-11-13 112 views
2

我已经在这几天现在正在和我前往抗拔我的头发因此任何帮助,将不胜感激。djangorestframework USER_ID违反了非空约束

我有一个叫包简单的模型,有一个userFrom和用户至

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 

Hoever似乎pre_save ISN”不会被调用,用户标识的映射也不会发生。当我使用api登录并尝试推送新软件包时,出现错误。

我试图映射此有密切尽可能教程http://django-rest-framework.org/tutorial/4-authentication-and-permissions.html没有任何的运气。

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

浏览源到SQL我可以看到userfrom_id和userto_id均为空。

任何想法的赞赏。

Ĵ

+0

您可以加入到这个问题的看法是什么样子,如果有什么事情,你在你的'REST_FRAMEWORK'设置字典有哪些? –

回答

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() 
+1

谢谢!我认为这件事是一个惊人的电话回来......谢谢! –

3

你定义pre_save方法(),它不是一个视图,它是一个型号方法,并应在对象包的一个实例是inteded被保存之前分辩执行。会发生什么是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',) 
0

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

由于doc状态:

记住pre_save()方法不受GenericAPIView本身调用,但它是由创建()和update()调用的CreateModelMixin和UpdateModelMixin类的方法。

+1

你能够展示代码的工作示例吗?这本身并没有真正回答这个问题。 – brandonscript

相关问题