首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在迭代查询集中将参数传递给对象模型类的__init__

在迭代查询集中将参数传递给对象模型类的__init__
EN

Stack Overflow用户
提问于 2017-08-31 23:50:41
回答 1查看 1.5K关注 0票数 6

我有一个具有重写的__init__方法的模型,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyModel(models.Model):
    ...

    def __init__(self, *args, **kwargs):
        if not kwargs.get('skip', False):
            do_something()
        super().__init__(*args, **kwargs) 

当我执行查询集时,如何将skip参数传递给__init__

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = [obj for obj in MyModel.objects.all()]

我想在自定义管理器中通过方法实现这一点,使用如下所示:queryset.with_skip()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-01 15:42:36

我看到,在将参数skip传递给super().__init__之前,您不会从kwargs中删除它。这意味着"skip“是字段的名称,否则就会出现异常TypeError("'skip' is an invalid keyword argument for this function")

如果在使用对象之前创建对象时确实需要do_something(),那么任何人都不应该忘记避免所有不受支持的方式(??)那么,定制经理等等是不够的。

您的问题是,models.Model.__init__(...)非常完美地支持*args**kwargs参数,因此它们应该是可互换的。您破坏了它,如果“跳过”是通过位置参数的完整元组传递的,则忽略它。也就是说,如果对象是从数据库创建的。读取文档定制模型加载

..。如果模型的所有字段都是存在的,那么就可以保证值按照__init__()期望的顺序进行。也就是说,实例可以由cls(*values)创建. 。 | @classmethod | def from_db(cls, db, field_names, values): | ... | instance = cls(*values) | ...

修复它的一个简单方法是在super().__init__之后调用super().__init__并读取self.skip,而不是实现对kwargs和args的解析。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs) 
        if not self.skip:
            do_something()

如果需要的话,问题可能是在super().__init__末尾发送的信号“super().__init__”。

最后一种可能是支持*args (hacky,但仍以某种方式使用文档名称):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    def __init__(self, *args, **kwargs):
        if kwargs:
            skip = kwargs.get('skip', False)
        else:
            # check "val is True" in order to skip if val is DEFERRED
            skip = any(field.name == 'skip' and val is True
                       for val, field in zip(args, self._meta.concrete_fields)
                       )
        if not skip:
            do_something()
        super().__init__(*args, **kwargs)

编辑:,你可能不需要你想要的东西,而一个代理模型可以做一些额外的事情,有时在同一个数据库表中的相同数据上的一个基本模型是正确的解决方案。("Skip“看起来不是描述对象数据的名称,而是描述对象创建模式的名称。测试和维护子类比内部的神秘开关更容易。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45995549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文