在Django中用数据库表达式将字符串转布尔值(用于生成字段)
Django模型:将属性
is_scannable转为GeneratedField判断字符串是否为空 原模型代码:
class Product(models.Model): ... barcode_data = models.CharField( max_length=255, blank=True, default="", ) @property def is_scannable(self): if self.barcode_data: return True else: return False
想要修改为使用GeneratedField的版本:
class Product(models.Model): ... barcode_data = models.CharField( max_length=255, blank=True, default="", ) is_scannable = models.GeneratedField( expression=..., output_field=models.BooleanField(), db_persist=True, )
实现方法
你可以通过Django的数据库表达式组合来实现这个逻辑,核心是判断barcode_data是否为非空字符串,以下几种方式都能达成需求:
方法1:使用Case和When条件表达式
直接通过条件分支生成布尔值:
from django.db.models import Case, When, BooleanField class Product(models.Model): ... barcode_data = models.CharField( max_length=255, blank=True, default="", ) is_scannable = models.GeneratedField( expression=Case( When(barcode_data="", then=False), default=True, output_field=BooleanField() ), output_field=models.BooleanField(), db_persist=True, )
方法2:利用Length函数判断字符串长度
通过判断字符串长度是否大于0来确定是否非空:
from django.db.models import Func, F class Product(models.Model): ... barcode_data = models.CharField( max_length=255, blank=True, default="", ) is_scannable = models.GeneratedField( expression=Func(F('barcode_data'), function='LENGTH') > 0, output_field=models.BooleanField(), db_persist=True, )
方法3:使用Q表达式取反
通过非空字符串的条件直接生成布尔值:
from django.db.models import Q class Product(models.Model): ... barcode_data = models.CharField( max_length=255, blank=True, default="", ) is_scannable = models.GeneratedField( expression=~Q(barcode_data=""), output_field=models.BooleanField(), db_persist=True, )
以上三种方法都能映射到数据库层面的SQL逻辑,实现和原@property完全一致的效果:当barcode_data不为空字符串时,is_scannable返回True,否则返回False。
内容的提问来源于stack exchange,提问作者darkhorse
相关产品推荐
相关产品推荐

