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 层写好,业务层直接调用方法来获取处理好的数据.

回到顶部