【发布时间】:2017-09-01 07:50:41
【问题描述】:
我有一个覆盖__init__ 方法的模型,如下所示:
class MyModel(models.Model):
...
def __init__(self, *args, **kwargs):
if not kwargs.get('skip', False):
do_something()
super().__init__(*args, **kwargs)
当我迭代查询集时,如何将skip 参数传递给__init__:
data = [obj for obj in MyModel.objects.all()]
我想通过自定义管理器中的方法来实现这个,使用这样的东西:queryset.with_skip()
【问题讨论】:
-
do_something()是做什么的?可能有更好的方法来覆盖__init__。 -
您可以编写自己的经理并将
do_something()重新定位到您的新默认经理中。 -
@Alasdair,是的,我相信它会更好,我在Django Documentation 中读到了这个,覆盖
__init__方法不是一个好主意。但是在这种情况下,它为模型对象添加了属性,应该在对象更改之前使用。__init__方法中的do_something位置确保了这一点。 -
我仍然无法想象 do_something() 的角色在
__init__之前可能有用,如果它设计得好的话。是外部交互(如pre_init信号或日志记录)还是数据解析? “跳过”真的是数据的一部分还是一种优化,你想有时用跳过从数据库中读取同一个对象,有时用做某事?你考虑过考试吗?你能在测试中安全地做一些事情还是必须跳过?您是否需要通过一个查询集一起读取有和没有跳过的对象? -
非常感谢,@hynekcer!我为我的解决方案使用了代理模型。
do_something中的内容实际上并不重要,因为我无法触及那段代码。我在我的块中制作了该模型的代理,并以这种方式简单地覆盖了__init__方法def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs, skip=True)就是这样!
标签: django django-models django-queryset