我现在已经看了好几天了,我正在拔头发,所以任何帮助都会受到赞赏。
我有一个名为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。
任何想法都非常感激。
Ĵ
答案 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()方法调用它。