gpt4 book ai didi

python - 在 Django View 中将用户/帐户表添加到 Postgres

转载 作者:行者123 更新时间:2023-11-29 11:29:05 24 4
gpt4 key购买 nike

去编辑2

在 views.py 中调用以下 adduser 函数。我首先保存用户,因为它的 id(由 Django 在插入时自动创建)是帐户和密码的主/外键。添加用户似乎工作正常,但是当它到达 Accounts(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".

但是 key 应该在那里,因为它只是将用户保存到数据库中......

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 的内容,任何想法

到 war 基金!

最佳答案

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

OmniCloud_App_accounts
OmniCloud_App_user

第二张表使用单数。没有第二张这样的 table 是偶然的:

OmniCloud_App_users

此外,在 PostgreSQL 中使用混合大小写标识符是 SO 上声誉的重要来源。它迟早会咬你一口。这种愚蠢行为的受害者是这里的常客。可能有任何具有此名称的表 - 你忘记了 "OmniCloud_App_user" 某处的双引号?

omnicloud_app_user

要么是那个,要么是保存用户的事务还没有提交。您能否只创建用户(还没有帐户)并检查它是否以正确的 ID 出现在表中的正确数据库中?

编辑:诊断问题的工具

如果您知道正在创建用户,那么问题是:外键是否constraint user_id_refs_id_468fbcec324e93d2 看对地方了?同一个数据库?相同的架构?同 table ?

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

SELECT n.nspname AS schema_name
,c.relname AS table_name
,c.relhastriggers
,c.reltuples
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname ~~* '%user%'
AND c.relkind = 'r'
AND nspname <> 'pg_catalog';

显示名称中包含“user”的所有模式中的所有表,不区分大小写。另外,如果表有触发器(可能会导致您的问题)以及其中有多少行(估计由 ANALYZE 更新)。可能会给你一个线索......

您还可以使用标准命令行客户端(交互式终端)的元命令\d psql .

我会运行一个测试用例并让 postgres 服务器记录它得到的所有内容。为此目的设置此参数:

set log_statement = 'all';

手册about logging-parameters .

log_statement (enum)

Controls which SQL statements are logged. Valid values are none (off), ddl, mod, and all (all statements).

关于 how to set parameters 的手册.

关于python - 在 Django View 中将用户/帐户表添加到 Postgres,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8039116/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com