簡體   English   中英

為什么Django為auth.User.username設置了較短的外鍵最大長度?

[英]Why does Django set a shorter maximum length of foreign keys to auth.User.username?

我有一個帶有外鍵的模型,它引用了auth.User用戶 名字段 原始字段的最大長度為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),但是當你的模型引用它時,外來的hey有一個更短的max_length為30.因此,如果用戶注冊了31個字符的用戶名,我將無法創建該用戶的子對象,因為將違反外鍵約束。 我需要這個,因為我有一個REST API,其URL嵌套使用的資源,由用戶名而不是ID引用。 例如: /users/<username>/profiles/...

更新:我認為這種行為的原因是User模型的未記錄的可交換屬性。 它可以通過自定義模型進行更換。 但是,配置的模型必須在定義模型的應用程序的初始遷移中具有其數據。 遷移代碼似乎生成對可交換模型的初始遷移的引用。 我使用默認的用戶模型,其初始遷移將用戶名設置為30個字符。 因此我的用戶名FKs長30個字符。 我能夠通過RunSQL遷移來解決這個問題,將FK數據類型改為varchar(15),但我懷疑這是否正確。

建議使用短標識符,varchar(30)是一個長數字,類似於999999999999999999999999999999,當Django使標識符始終使用相同的數字時。 如果你達到這個數字,我不認為你會使用這么多用戶你應該創建另一種類型的標識符。 請記住,user_id字段的長度是用戶名的id而不是字符串

你可以使用這個SO答案中描述的這個hack,但要非常小心!

或者你可以使用這個包

但是,我認為,正如本討論中所述,最好的方法是創建自定義User模型並在那里做任何你想做的事情。

希望能幫助到你!

您必須使用自定義用戶模型。來自django docs。

150個字符或更少。 用戶名可以包含字母數字,_,@,+ ,. 和 - 字符。

對於許多用例,max_length應該足夠了。 如果您需要更長的長度,請使用自定義用戶模型。 如果您使用帶有utf8mb4編碼的MySQL(建議用於正確的Unicode支持),請最多指定max_length = 191,因為默認情況下,MySQL只能創建包含191個字符的唯一索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM