Python 在Django视图中将用户/帐户表添加到Postgres

Python 在Django视图中将用户/帐户表添加到Postgres,python,django,postgresql,django-views,Python,Django,Postgresql,Django Views,转到编辑2 在views.py中调用以下adduser函数。我首先保存用户,因为它的id(插入时由Django自动创建)是帐户和密码的主键/外键。添加用户似乎工作正常,但当它进入帐户(user=u)时,会引发以下错误: IntegrityError at /adduser insert or update on table "OmniCloud_App_accounts" violates foreign key constraint "user_id_refs_id_468fbcec324e9

转到编辑2

在views.py中调用以下adduser函数。我首先保存用户,因为它的id(插入时由Django自动创建)是帐户和密码的主键/外键。添加用户似乎工作正常,但当它进入
帐户(user=u)
时,会引发以下错误:

IntegrityError at /adduser
insert or update on table "OmniCloud_App_accounts" violates foreign key constraint "user_id_refs_id_468fbcec324e93d2"
DETAIL:  Key (user_id)=(4) is not present in table "OmniCloud_App_user".
但是密钥应该在那里,因为它刚刚将用户保存到数据库

def adduser(request):
    username = request.POST['username']
    password = request.POST['password']
    u = User.objects.create_user(username, request.POST['email'], password)
    u.save()
    a = Accounts(user=u)
    p = Passwords(user=u)
    a.save()
    p.save()
    user = authenticate(username=username, password=password)
    if user is not None and user.is_active:
        auth.login(request, user)
        return HttpResponseRedirect("/%s/" %u.id)
    else:
        return HttpResponseRedirect("/account/invalid/")
编辑:以下是帐户初始化的开始:

from django.db import models
from django.contrib.auth.models import User
class Accounts(models.Model):   
    user = models.ForeignKey(User)
编辑2 通过进入管理页面,我意识到,当它抱怨4不在数据库中时,这是因为它正在添加第三个用户。添加第4个用户会抛出一个错误,即没有id为5的用户(duh)。我在代码中没有看到任何会导致它搜索user_id+1的内容,有什么想法吗


给战争基金

我的钱在一个拼错的名字上。我在错误消息中注意到您

OmniCloud_App_accounts
OmniCloud_App_user
第二个表使用单数。没有第二张这样的桌子是偶然的:

OmniCloud_App_users
此外,在PostgreSQL中使用混合大小写标识符也是一个很好的声誉来源。它迟早会咬你的。这种愚蠢行为的受害者是这里的常客。任何具有此名称的表都有可能-您忘记了某个地方的双引号了吗

omnicloud_app_user
要么是这样,要么是保存用户的事务尚未提交。您能否只创建用户(目前还没有帐户)并检查它是否位于表中正确的数据库中以及是否具有正确的ID

编辑:用于诊断问题的工具 如果您知道正在创建用户,那么问题是:外键 约束
user\u id\u refs\u id\u 468fbcec324e93d2
查看正确的位置?同一个数据库?相同的模式?同一张桌子

要找出数据库中存在哪些表,请尝试以下查询(如果您具有必要的权限):

手册

log_语句(枚举)

控制记录哪些SQL语句。有效值包括none(关闭)、ddl、mod和all(所有语句)


上的手册。

我看不出您提供的代码中有任何会导致该错误的错误,但您所做的一些事情与

您似乎正在使用ForeignKey关系—这可能不是您想要的,除非您计划将一个用户链接到多个帐户。一对一的关系可能是你想要的,除非是这样

使用处理程序来创建与用户相关联的帐户似乎是处理事情的更好方法——django将处理调用处理程序的问题,而不必记住调用适当的代码。虽然这是否能解决你的问题,但我不太确定


建议您在调用create_user后不需要调用u.save(),除非您在创建用户后更改了该用户。

尝试用以下方式装饰您的函数:

from django.db import transaction

 @transaction.autocommit
 def adduser(request):
django对postgres的默认设置是使用视图启动事务,并在最后提交它(例外情况是回滚)


因此.saved()对象并不总是您期望的方式…

在accounts Model和userprofile中很少有注释使用OneToOneField 并为账户储蓄发出信号储蓄

您可以通过这种方式使用“保存用户”。Pylint说这不好,但在Django内部使用的方法相同

try:
    user = User.objects.create(**request.POST) #better way save from forms, no the forms is best way 
except:
    #exception logic
    pass
else:
    auth.login(request, user)
所以如果你使用表单

form = UserForm(request.POST or None)
if form.is_valid():
    user = form.save()
    auth.login(request, user)
else:
    #invalid data logic
    pass

Accounts是什么类型的对象?Accounts是一个类似于用户的模型,只是有大量不同的社交、媒体和电子邮件用户名字段。
u.save()
不需要,因为
create\u User()
应该已经将其提交到数据库。您可能应该在Accounts模型中显示user字段。您有自己的用户模型吗?
user=models.ForeignKey(user)
用户模型是Django的默认模型。是否确定创建用户保存?我之前在一次初始化所有三个表然后保存时遇到了问题,因为它显示了类似的情况,在创建帐户或密码之前按u.save()可以修复它。您是否使用contrib.auth.models中的用户模型?因为错误是:“OmniCloud\u App\u user”而不是“OmniCloud\u auth\u user”,我将很快对此进行研究,但为了回答您最后一个问题,我知道用户正在被创建,因为当我尝试通过重新填充注册页面进行调试和测试时,
键(user\u id)=(4)
会按其应该的方式每次递增,尝试注册相同的用户名会被拒绝。因此,用户被添加,而不是帐户。我在那里添加了帐户初始化。用户是我没有声明的模型(Django内置模型)。Django是否将其作为用户保存到数据库中,甚至认为您导入用户来使用它?@Cris:我更新了我的答案,并提供了一些帮助来分析问题。我帮不了你多少忙。不是我的专业领域。我能得到的最接近的答案是这个。可能是因为我以前有一个自定义用户表,在安装默认的Django表时没有正确删除该表。不管怎么说,你给了一个非常彻底的回答,如此快乐的赏金!所以我不会叫你save,因为它会自动保存?
try:
    user = User.objects.create(**request.POST) #better way save from forms, no the forms is best way 
except:
    #exception logic
    pass
else:
    auth.login(request, user)
form = UserForm(request.POST or None)
if form.is_valid():
    user = form.save()
    auth.login(request, user)
else:
    #invalid data logic
    pass