【问题标题】:Django : Know if property is the default valueDjango:知道属性是否是默认值
【发布时间】:2010-11-03 23:02:12
【问题描述】:

您如何知道某个值是否是模型属性的默认值。

例如

class Alias(models.Model) :
  image = models.ImageField(upload_to='alias', default='/media/alias-default.png')

a = Alias.get("123")
# this doesn't work
if a.image == a.image.default :
  pass
# nor this
if a.image == Alias.image.default :
  pass

我尝试在文档中挖掘,但什么也没看到。

【问题讨论】:

    标签: django django-models


    【解决方案1】:

    Django 中的 default 与 SQL 默认值不同 - 它只是供管理员在创建新对象时自动填充表单字段。

    如果您想将某个值与定义为default 的值进行比较,您必须在其他地方定义它(即在settings.py 中)。喜欢:

    class MyModel(models.Model):
        ...
        my_field = models.IntegerField(default=settings.INT_DEFAULT)
    

    default 值存储在 MyModel._meta._fields()[field_creation_index].default 中,但请注意这是在挖掘内部结构。

    【讨论】:

    • 任何以下划线开头的名字都应该被认为是内部的。反正 1.0 和 1.1 之间没有变化。
    • 如果你想使用内部属性(_meta对于内部API来说是相当稳定的),阅读MyModel._meta.get_field('field_name').default比通过创建索引访问更容易。
    • 当然,我什至不知道 Meta 存在这种方法。我总是使用 fields() 对完整的字段列表进行迭代,从未尝试访问单个字段属性。 :)
    • _meta 已在 Django 1.8 中正式化:docs.djangoproject.com/en/dev/ref/models/meta
    • @furins 谢谢,这是我需要的信息!但这里有一个指向您所指版本的静态链接:docs.djangoproject.com/en/1.8/ref/models/meta
    【解决方案2】:

    你不能从属性本身得到它,你必须通过model._meta下的模型选项。

    a._meta.get_field_by_name('image')[0].get_default()
    

    【讨论】:

    • 是否支持或将来可能会改变?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 2022-01-05
    • 2012-01-30
    • 1970-01-01
    • 2010-12-12
    • 2016-08-15
    • 1970-01-01
    相关资源
    最近更新 更多