【问题标题】:Django, How to change "blank" attribute of field from parent model?Django,如何从父模型更改字段的“空白”属性?
【发布时间】:2014-07-03 10:39:52
【问题描述】:

我有两个模型,例如:

Parent(models.Model):
    mytext= models.Chafield(max_lenght=250, blank=True)

Child(Parent):
    mytext_comment=models.Chafield(max_lenght=250)

但对于孩子,我希望mytext 是强制性的。 在子 __init__ 中调用 mytext.blank=False 就足够了吗? 注意这不是抽象方法,因为我希望能够在 Parent 上使用 Manager(例如,Parent.objects.all())

【问题讨论】:

  • 我希望看到它会有问题。在最坏的情况下,我将在表单验证或自定义字段验证器中进行。很高兴听到您对解决此问题的最佳方法的意见。

标签: python django inheritance django-models


【解决方案1】:

我认为这是不可能的。来自 Django Documentation

此限制仅适用于作为 Field 实例的属性。 如果您愿意,可以覆盖普通的 Python 属性。它也只 适用于 Python 看到的属性名称:如果你是 手动指定数据库列名,你可以有相同的 出现在子模型和祖先模型中的列名 多表继承(它们是两个不同数据库中的列 表)。

PS:我试着喜欢你的建议,但我得到了像unicode object has no attribute blank这样的错误

【讨论】:

    【解决方案2】:

    嗯,你可以试试这个解决方案:

    Parent(models.Model):
        mytext= models.Chafield(max_lenght=250, blank=True)
    
    Child(Parent):
        mytext_comment=models.Chafield(max_lenght=250)
    Child._meta.get_field('mytext').blank = True
    

    你能告诉我它是否有效吗?

    【讨论】:

    • 今天下班了,明天试试,给你反馈。
    • stackoverflow.com/a/928774/1016772 在 mtaube 的评论中声明它更改了超类属性,因此它可能会破坏父级。如果父母是抽象的,但在我的情况下不是这样 - 我打算使用 parent to i.a.制作在一个地方列出所有孩子的列表视图,并且抽象方法没有管理器......
    【解决方案3】:

    随着讨论的进行,我认为正确的答案是:

    您不会在模型级别上这样做。我应该在表单级别而不是在模型中进行这种验证。最好的地方是:表单字段参数或表单清理方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 2017-11-07
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多