gpt4 book ai didi

python - Django 小写字符字段

转载 作者:太空狗 更新时间:2023-10-29 17:44:32 26 4
gpt4 key购买 nike

我们实现了 LowerCaseCharField。我们很乐意听到更好的实现建议。

from django.db.models.fields import CharField

class LowerCaseCharField(CharField):
"""
Defines a charfield which automatically converts all inputs to
lowercase and saves.
"""

def pre_save(self, model_instance, add):
"""
Converts the string to lowercase before saving.
"""
current_value = getattr(model_instance, self.attname)
setattr(model_instance, self.attname, current_value.lower())
return getattr(model_instance, self.attname)

其实我们爱拥有的是:

> modelinstance.field_name="TEST"
> print modelinstance.field_name
'test'

当前实现仅在保存时转换为小写。

最佳答案

您可能希望覆盖 to_python,这将允许您在进行数据库查找时比较非小写字符串。实际的方法是 get_prep_value,但由于它为 CharField 调用了 to_python,所以覆盖它更方便:

def to_python(self, value):
value = super(LowerCaseCharField, self).to_python(value)
if isinstance(value, basestring):
return value.lower()
return value

现在您可以执行如下查询:

MyModel.objects.filter(lccf="MiXeD")

编辑:

重新阅读您的问题,您似乎希望 Markdown 立即生效。为此,您需要创建一个描述符(一个带有 __get____set__ 方法的新型 python 对象,请参阅 the python docs 和相关模型的 django 代码) 并覆盖字段中的 contribute_to_class 以将模型的字段设置为您的描述符。

这是我头脑中的一个完整示例,它应该可用于所有想要修改设置值的字段。

class ModifyingFieldDescriptor(object):
""" Modifies a field when set using the field's (overriden) .to_python() method. """
def __init__(self, field):
self.field = field
def __get__(self, instance, owner=None):
if instance is None:
raise AttributeError('Can only be accessed via an instance.')
return instance.__dict__[self.field.name]
def __set__(self, instance, value):
instance.__dict__[self.field.name] = self.field.to_python(value)

class LowerCaseCharField(CharField):
def to_python(self, value):
value = super(LowerCaseCharField, self).to_python(value)
if isinstance(value, basestring):
return value.lower()
return value
def contribute_to_class(self, cls, name):
super(LowerCaseCharField, self).contribute_to_class(cls, name)
setattr(cls, self.name, ModifyingFieldDescriptor(self))

关于python - Django 小写字符字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2350681/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com