【问题标题】:Django - querying all models that have common fieldsDjango - 查询所有具有公共字段的模型
【发布时间】:2013-04-25 04:49:31
【问题描述】:

如果我有许多 Django 模型 - 都具有以下公共字段:-

created_by = models.ForeignKey(User)
modified_by = models.ForeignKey(User)

我想查询所有模型以找出特定用户创建或修改了哪些对象,有没有一种健全的方法可以实现这一目标?

还是我必须退回到ModelA.objects.filter(created_by=userone) ModelB.objects.filter(created_by=userone) 等等?

我应该提到,实际上这些字段位于一个抽象基类中,所有其他模型都从该基类继承它们。但是让我们假装我没有告诉你我刚刚告诉你的关于抽象基类的事情,还有办法做我想做的事吗?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    要扩展 akshar raaj 所说的内容,您可以通过一组模型来简化代码。

    query_models = [ModelA, ModelB, ModelC, ModelD]
    for query_model in query_models:
        results = query_model.objects.filter(created_by=userone)
        if len(results) > 0:
            print '%s has it!!!' % query_model.__name__
    

    【讨论】:

    • 这是一个很好的指针。如果没有更有效的方法来实现这一点,我可能会这样做。
    【解决方案2】:

    您必须一次在一个模型上进行操作。 Djano ORM 管理器在内部使用了一个名为 Queyset 的类,它与数据库对话,并且此类 QuerySet 实例在它们上具有 model 属性,这与单个表同义。因此,尽管可以进行连接操作,但它们只能与一张表对话。但是对于您的场景,您将不得不多次调用 db。

    orm 只是对数据库的抽象,想一想你是否可以直接用 sql 做到这一点。

    在 sql:

    select val from test union select val from test2 union......;
    

    所以会有很多联合,因为你说你有很多模型,所以通过单个 db 调用来完成这一点没有多大意义。

    【讨论】:

    • 确实有很多模型,我在这里处理。正在寻找一种有效的方法来做到这一点。
    猜你喜欢
    • 2020-08-04
    • 2018-10-06
    • 2018-03-16
    • 2012-09-29
    • 2020-04-21
    • 1970-01-01
    • 2020-03-05
    • 2011-12-02
    • 2011-11-17
    相关资源
    最近更新 更多