1
19
模型字段已经是属性,所以我认为您必须用第二种方法来避免名称冲突。 当您定义foo=property(..)时,它实际上会覆盖foo=models.。行,这样字段将不再可访问。 您需要为属性和字段使用不同的名称。事实上,如果按照示例1中的方法操作,当您尝试访问属性时,会得到一个无限循环,因为它现在试图返回自身。 编辑:也许您还应该考虑不使用foo作为字段名,而是使用foo,然后为您的属性定义另一个名称,因为属性不能在queryset中使用,所以您在执行筛选时需要使用实际的字段名。 |
2
16
如前所述,实现自己的django.db.models.field类的正确替代方法应该使用- dB列 参数和自定义(或隐藏)类属性。我只是在@jiaaro的编辑中按照更严格的Python OOP惯例(例如,如果确实隐藏了foo)重写代码:
夜猫子 将被分解为 我的模特儿 (如所见) DIR(…) 如此隐藏 private )。请注意,此表单还允许使用 @property decorator 这最终将是编写可读代码的更好方法。 同样,Django将创建带两个字段的*MyModel表 福 和 酒吧 . |
3
5
以前的解决方案会受到影响,因为@property会导致admin和.filter(foo)出现问题。 更好的解决方案是重写 塞特拉特 但这可能会导致从数据库初始化ORM对象时出现问题。然而,有一个技巧可以解决这个问题,它是通用的。
秘密是' 在自我的状态下。__ '.当模型从新的或从 第二节 ! |
4
0
这取决于
如果您希望在筛选查询集(不需要首先对其进行评估)时使用这种“覆盖”(或“回退”)行为,我认为属性不能做到这一点。
As far as I know
,python属性在数据库级别不起作用,因此不能在queryset过滤器中使用。注意你
可以
使用
但是,如果您的用例允许,那么
这意味着您可以指定
剩下的问题是如何实现这一点。 如果你不在很多地方使用它,简单地说 annotating 查询集可能是最简单的。使用您的示例,不使用属性资料:
然后按如下方式进行查询:
现在,查询集中的项具有magic属性
结果
SQL query
从
注意:您也可以调用模型字段
必须有几种方法来创建Dry实现,例如编写 custom lookup ,或者 custom(ized) Manager . 自定义管理器很容易实现如下(请参见 example in docs )以下内容:
现在的每个查询集
但是,请注意,例如更新
可能是一个带有注释的自定义管理器和一个Python的组合
|
Florent · 如何在Django中聚合多个字段? 1 年前 |
KWunsch · Django没有将pk引入模板 1 年前 |
Akshay mek · Vscode扩展建议不适用于某些文件夹 1 年前 |
Farid · 限制django每个客户的访问 2 年前 |
Blue · 从Django中的输入字段获取用户输入 2 年前 |
4SadMemeXD · 无法在Django中选择相关类别 2 年前 |