Django Slugfield如何处理下划线和连字符的唯一性相同



我有一个slugfield:

name = models.CharField(
unique=True, validators=[
validate_slug,
],
max_length=255
)

然而,我也希望确保在连字符和下划线被相同对待的地方检查唯一性。

对于此测试用例:

name1 = 'surfer_190_chap`
name2 = `surfer-190_chap`
record = Record(name=name1)
if record.full_clean():
record.save()
record2 = Record(name=name2)
with self.assertRaises(ValidationError):
if record2.full_clean():
record2.save()

第二个名称应该失败,但它没有失败。

我尝试了什么(我仍在研究如何完成这一部分(:

def validate_unique_underscore_hyphen(value):
if '_' in value or '-' in value:
...
name = models.CharField(
unique=True, validators=[
validate_slug,
validate_unique_underscore_hyphen
],
max_length=255
)

根据验证对象,此验证的正确位置在模型的clean()clean_<field>()方法中。

models.py:中

class Record(models.Model):
...
def clean(self):
if self.name:
value  = self.name
if '_' in value or '-' in value:
expression = value.replace('-', '_').replace('_', '[-_]')

raw_expression = r'^{}$'.format(expression)
try:
match = Record.objects.get(name__iregex=raw_expression)
raise ValidationError(
_('%(value)s matches existing Record %(match)s'),
params={
'value': value,
'match': match.name
},
)
except Record.DoesNotExist:
pass

这将创建一个正则表达式-将连字符或下划线的所有实例转换为2的or。使用该正则表达式对数据库进行查询,如果找到,则引发验证。

最新更新