能否通过字符串类型PK获取Django模型对象?示例代码是否可行?
当然可以!咱们一步步来拆解你的问题:
1. 字符串类型主键(PK)完全可以用来获取Django模型对象
Django对主键的类型支持很灵活,如果你在模型里把主键定义为字符串类型(比如CharField),直接用字符串主键查询毫无问题。举个例子:
from django.db import models class UserProfile(models.Model): # 用字符串作为主键 user_id = models.CharField(max_length=32, primary_key=True) username = models.CharField(max_length=50)
要获取主键为"user_123"的对象,直接这么写就行:
profile = UserProfile.objects.get(pk="user_123") # 或者用字段名直接查,效果一样 profile = UserProfile.objects.get(user_id="user_123")
Django会精准匹配字符串类型的主键值,完全不用担心类型不兼容的问题。
2. 数字主键转字符串后执行
get(pk=str_pk)是可行且能正常运行的 如果你的模型用的是默认的数字主键(比如AutoField或者BigAutoField),当你把数字主键转成字符串(比如str(21))再传入get(pk=...)时,Django会自动帮你把字符串转换为对应的数字类型去匹配数据库里的主键值。
也就是说,这段代码:
str_pk = str(21) obj = ExampleModel.objects.get(pk=str_pk)
和直接写ExampleModel.objects.get(pk=21)的效果完全一样,都能正确找到主键为21的对象。
不过要注意的是:如果传入的字符串不是合法的数字(比如"abc"),Django会抛出ValueError,或者因为找不到匹配的对象抛出ExampleModel.DoesNotExist异常,所以在实际使用时最好做好异常处理。
内容的提问来源于stack exchange,提问作者David Foie Gras
相关产品推荐
相关产品推荐

