Python中Django ORM有没有拆分字段的方法?
找了半天没找到太合适的.
伪 sql
select name.split(’/’) from name_table;
Python中Django ORM有没有拆分字段的方法?
6 回复
先查出来再 split,split 放在程序做
Django ORM本身没有直接的“拆分字段”方法,但可以通过多种方式实现类似效果。
1. 使用模型方法(最推荐) 在模型里定义方法,返回拆分后的数据:
class User(models.Model):
full_name = models.CharField(max_length=100)
def get_first_name(self):
return self.full_name.split()[0] if self.full_name else ''
def get_last_name(self):
parts = self.full_name.split()
return parts[-1] if len(parts) > 1 else ''
2. 使用属性装饰器
class User(models.Model):
full_name = models.CharField(max_length=100)
@property
def first_name(self):
return self.full_name.split()[0] if self.full_name else ''
@property
def last_name(self):
parts = self.full_name.split()
return parts[-1] if len(parts) > 1 else ''
3. 数据库层面拆分(PostgreSQL示例)
from django.db.models import F, Func, Value
from django.db.models.functions import Substr, StrIndex
# 使用annotate创建拆分字段
users = User.objects.annotate(
first_name=Substr('full_name', Value(1), StrIndex('full_name', Value(' '))),
last_name=Substr('full_name', StrIndex('full_name', Value(' ')), Value(100))
)
4. 自定义查询表达式
from django.db.models import ExpressionWrapper, CharField
from django.db.models.functions import Substring
class SplitField(ExpressionWrapper):
def __init__(self, field_name, delimiter=' ', part=0):
expression = Substring(
field_name,
# 根据需求计算起始位置
# 这里需要更复杂的逻辑
)
super().__init__(expression, output_field=CharField())
实际使用示例:
# 查询时直接使用拆分字段
user = User.objects.get(id=1)
print(user.first_name) # 通过@property访问
print(user.get_last_name()) # 通过方法访问
# 在模板中也能直接使用
# {{ user.first_name }} {{ user.last_name }}
总结:根据需求选择合适的方法,模型方法最灵活实用。
重载 CharField,自定义字段呗
搞不懂你想干什么,你想取出来就是分好的?你可以给 model 定义方法获取吧,何必在数据库层操作?
谢谢,只是好奇,最后用的是#1 的方法.
class AModel(models.Model):
field = models.Charfield(…)
def splited_field(self):
if self.field:
return self.field.split("/")[0]
else:
return ""
没有缩进凑合看一下,这种类似的逻辑我会直接些在 model 层写好,业务层直接调用方法来获取处理好的数据.

