将user_id保存为ForeignKey

时间:2014-01-25 04:03:50

标签: django django-models django-users

我有一个带有响应模型的调查,我想链接到现有用户。她应该能够在个人资料页面上查看她过去对调查的回复。好吧,无论如何,那是计划。但我甚至无法将用户链接到响应。

(django == 1.5,django-lazysignup)

用户当前是Response中的ForeignKey以获取链接

# models.p
from django.contrib.auth.models import User
class Response(models.Model):
    survey = models.ForeignKey(Survey)
    user = models.ForeignKey(User)
    ...

#views.py
@allow_lazy_user
def survey_detail(request, slug):
    ...
    if form.is_valid():
        response = form.save(commit=False)
        response.user = request.user
        response.save()
        ...

错误:

IntegrityError: null value in column "user_id" violates not-null constraint

字段user_id包含在表响应中。由于南模式迁移,我不得不设置一次性值并选择现有的user_id。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

你的代码看起来不错。我要做的第一件事就是在保存之前检查User对象。 print type(request.user), request.user。您还可以检查您的Response模型对象,以确保它符合您的期望。这表明你是否需要检查表单代码或装饰器。

我不确定你为南迁移“设置一次性价值”是什么意思。南方不会与此有任何关系。您是在谈论使用固定user_id的黑客来获取要保存的表单吗?那不对。

正如您在自己的回答中所说,在用户FK字段上设置null=True, blank=True将起作用,但实际上这意味着可以从“无人”提交回复。这样做似乎可以解决症状。

您使用的是django-lazysignup(“django-lazyuser”似乎不是什么东西)?这是一个潜在的陷阱。简而言之,该软件包创建的临时用户可以点击convert/ URL来选择用户名和密码以成为官方用户。因为不是每个人都会这样做,所以有一个管理命令来清除未转换的懒惰用户。该命令将删除LazyUser模型对象真实的用户模型对象。默认情况下,Django将级联删除相关对象,例如你的Response对象。要防止响应在与未关联的惰性用户关联时以静默方式删除,请在ForeignKey(docs)上设置cascade属性。像user = models.ForeignKey(User, on_delete=models.PROTECT)之类的东西,确保安全地处理ProtectedError。这只有在你使用清理管理命令时才有意义,但是比对不起更安全,下一个维护代码的人可能会运行清理,因为谁不喜欢清理。

答案 1 :(得分:0)

使用null=True, blank=True

class Response(models.Model):
    survey = models.ForeignKey(Survey)
    user = models.ForeignKey(User, null=True, blank=True)
    ...