Django确保空白字段

时间:2013-12-28 17:16:01

标签: python django django-models

我希望能够禁用填充字段的功能,同时仍然可以在数据库中创建它。

此列将依赖于表中的其余行,并且始终是,因此它是必需的列,但在创建期间无法提供信息。这就是我所拥有的:

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指定了值,该怎么办?这是可能的,会打破一切......如何防止这种情况?

注意:如果代码中有任何错误,我道歉,我没有运行任何错误,只是伪代码显示依赖程度,谢谢!

2 个答案:

答案 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")