gpt4 book ai didi

python - 为什么 Django 会为 auth.User.username 设置一个较短的外键最大长度?

转载 作者:行者123 更新时间:2023-11-28 18:19:49 26 4
gpt4 key购买 nike

我有一个带有引用 auth.Userusername 字段的外键的模型。原始字段的最大长度为150。但是Django 生成了一个最大长度为30 的外键。

在我应用的 models.py 中:

class Profile(models.Model):
user = models.ForeignKey('auth.User', to_field='username')

在 django.contrib.auth.models 中:

username = models.CharField(
_('username'),
max_length=150,

生成的 SQL:

CREATE TABLE "myapp_profile" (
"id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
"user_id" varchar(30) NOT NULL REFERENCES "auth_user" ("username")
);

这仅在引用 auth.User.username 时发生。如果我在自己的模型中引用一个长字段,则可以很好地生成外键。

这是为什么呢?我该如何克服它?

使用 Django 1.11.4 和 Python 3.6.2。我尝试了 PostgreSQL 和 SQLite,但两者都出现了问题。

澄清:从目前的答案来看,我认为我的问题被误解了。我不是在寻找一种拥有长用户名的方法。我的问题是 Django 附带的普通用户模型有一个 max_length (150),但是当你的模型引用它时,外国嘿有一个较短的 max_length 30。因此,如果用户注册了 31 个字符的用户名,我将无法创建该用户的子对象,因为将违反外键约束。我需要这个,因为我有一个 REST API,其 URL 嵌套正在使用的资源,这些资源由用户名而非 ID 引用。例如:/users/<username>/profiles/...

更新:我认为这种行为的原因是用户模型的未记录的 swappable 属性。它被设计为可由定制模型替换。但是,配置的模型必须在定义模型的应用程序的初始迁移中具有其数据。迁移代码似乎生成了对可交换模型初始迁移的引用。我使用的是默认用户模型,其初始迁移将用户名设置为 30 个字符。因此,我的用户名 FK 长度为 30 个字符。我可以通过 RunSQL 迁移将 FK 数据类型更改为 varchar(15) 来解决此问题,但我怀疑这样做是否正确。

最佳答案

推荐使用短标识符,varchar(30)是一个长数字,比如99999999999999999999999999999,当Django使标识符总是使用相同的数字。我不认为如果你达到那个数字你会使用那么多用户,你应该创建另一种类型的标识符。记住 user_id 字段的 long 是用户名的 id 而不是字符串

关于python - 为什么 Django 会为 auth.User.username 设置一个较短的外键最大长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45911440/

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