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

标签 python django postgresql django-views

去编辑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/

相关文章:

python - 伊辛模型 2D Python

python - AND 感知器的权重和偏差是多少?

ruby-on-rails - Postgres 不会使用 c9.io 连接到 Ruby on Rails 应用程序中的服务器

postgresql - Postgres 从 jsonb 数组中提取值

python - 如何安装 'adium-theme-ubuntu' (virtualenv)

python - 如何将我的 Python 文件分离到多个插件?

python - Django 过滤器 - 按相关模型中字段的平均值过滤

python - 如何使用 Django 设置 ATOMIC_REQUESTS?它没有按我的预期工作

python - Django:如何正确使用UserProfile? (Django 授权额外信息)

linux - PostgreSQL 不会自动使用可用 RAM 进行内存密集型查询