簡體   English   中英

如何在 Django Models.py 中定義不區分大小寫的外鍵關系?

[英]How to define a case insensitive Foreign Key relation in Django Models.py?

我的 models.py 看起來像這樣:

class UserRoles(models.Model):
    userId=models.TextField(db_column='user_id',primary_key=True)
    loginId=models.TextField(db_column='login_id', unique=True)
    userRole=models.TextField(db_column='user_role')

class Assets(models.Model):
    user = models.ForeignKey(UserRoles,db_column='User',to_field='loginId',on_delete=models.PROTECT)

在我的 views.py 中,每當我制作 Object 時:

object = Assets.objects.all();

Assets 和 UserRoles 之間的連接是在外鍵值上自動進行的。 但是,“user”字段為大寫,“loginId”為小寫。 因此,僅獲取 loginId 中具有數值的行。

如何將外鍵之間的關系更改為不區分大小寫? 類似的東西

select * from Assets inner join UserRoles on lower(Assets.user) = UserRoles.loginId;

請注意,我無法對實際數據庫本身進行更改(如果相關,則在 Postgres 中)。

不要,這可能只會造成更多麻煩,而且JOINing等可能會降低效率。 您可以使用Lower [Django-doc]將值轉換為小寫:

from django.db.models.functions import Lower

Assets.objects.update(user_id=Lower('user_id'))

例如,如果您在 shell 中或在數據遷移中執行此操作,您會將user列的所有值轉換為其等效的小寫字母。

注意:將兩個操作數都轉換為小寫不足以執行不區分大小寫的匹配。 某些字符,例如Eszett ß [wiki]沒有小寫等效字符,但被認為不區分大小寫,例如等於ss (例如單詞paßstraß被認為等於passstrasse )。 應該使用casefold來檢查不區分大小寫的匹配。

暫無
暫無

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

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