我希望能够禁用填充字段的功能,同时仍然可以在数据库中创建它。
此列将依赖于表中的其余行,并且始终是,因此它是必需的列,但在创建期间无法提供信息。这就是我所拥有的:
class FooBar(models.Model):
some_field = models.BigIntegerField(blank=True)
another_field = models.CharField(max_length=100)
def save(self, *args, **kwargs):
if not self.some_field:
self.some_field = FooBar.objects.filter(another_field=self.another_field).count() + 1
super(FooBar,self).save(*args,**kwargs)
这在逻辑上是有道理的,您可以创建一个FooBar
实例,然后保存后,如果some_field
为空,它将根据表中依赖于{的行数来分配它{1}}。但问题出在这里:
如果在创建实例时为another_field
指定了值,该怎么办?这是可能的,会打破一切......如何防止这种情况?
答案 0 :(得分:2)
在字段上设置editable=False
。这将从任何ModelForms和管理员中删除它。但是,它不会阻止您在代码中的其他位置设置值。
答案 1 :(得分:0)
您可以覆盖模型的validation功能以添加自定义代码。
class YourModel(models.Model):
...
# You're trying to force a single field to be blank, so you need to
# override clean_fields().
# If several fields were required to validate, clean() would be more
# appropriate
def clean_fields(self, exclude=None):
super(models.Model, self).clean_fields(exclude)
# Check if the field should be ignored (for consistency)
if "your_field_that_should_be_blank" not in exclude:
# Validate the data. I'm assuming the field holds strings
if self.your_field_that_should_be_blank != "":
# Raise a ValidationError if invalid
raise ValidationError("That field should be blank")