如何在具有UniqueConstraint的Django模型中基于两个字段在空值或NULL之间进行选择,其中一个字段是可



我有一个Django模型,它有一个基于两个字段值的Uniqueconstraint,其中一个是强制性的,另一个是可选的。

这里的"最佳实践"是什么;可选的";字段(以及为什么(存储";没有值";介于:

  1. 无值=空
  2. 无值=NULL

型号.py

class Foos(models.Model):
name =  models.CharField(max_length=50, blank=False, null=False)
# Optional field
alias = models.CharField(max_length=100, blank=True, null=True)
class Meta:
managed = True
db_table = 'foos'
def __str__(self):
constraints = [models.UniqueConstraint(fields=['name', 'alias'], name='unique_foo')]
object_name = self.name
return object_name 

请注意,我需要插入一组来自外部源文件的值,"alias"的值可能等于None。

附录:事实上,数据可以通过两种方式插入,一种是从表单插入,另一种是通过Excel文件插入。基于表单的插入如下所示,所以我最终发现字段别名有空值和NULL,这从约束的角度来看是令人讨厌的,如果别名为NULL或空,则需要强制执行,这就是为什么我要求";最佳实践";在这里

表单.py

class FooCreateForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

self.fields['name'] = forms.CharField(label='Name',widget=forms.TextInput(attrs={ 'class': 'form-control' }))
self.fields['alias'] = forms.CharField(label='Alias',required=False,widget=forms.TextInput(attrs={ 'class': 'form-control' }))
class Meta(object):
model = Foos
fields = ('name','alias')

def clean_name(self):
name = self.cleaned_data['name']
return name

def clean_alias(self):
alias = self.cleaned_data['alias']
return alias  

my_importer.py

# Only relevant code mentionned
foos_imported = []
for foo in foos:
foo_name = foo["Name"]

if not Foos.objects.filter(name=foo_name,alias=foo["Alias"]):
foo_obj = Foos(
name=foo["Name"],
alias=foo["Alias"],
)

try:
foo_obj.save()
foos_imported.append(foo)
except Exception as e:
logger.error("Can't create foo {} : {}".format(foo["Name"],e.args))    

else:
logger.warning("Foo "{}" already exists within database, it won't be imported".format(foo_name))

您可以使用name="a"alias=None添加多个Foo。但您只能有一对name="a"alias=""

最新更新