【问题标题】:django database efficient querysets on two models两个模型上的 django 数据库高效查询集
【发布时间】:2013-11-17 14:18:34
【问题描述】:

我对 django 很陌生 - 我想知道是否可以使用 ORM 更有效地进行以下查询:

# somewhere in views.py..
if slug is not None:
    slug_field = self.get_slug_field()
    pkid = FinalModel.objects.all().get(slug__exact=slug)
    queryset = queryset.filter(owner__exact=pkid.id)
    obj = queryset.get()
    return obj

所以,基本上,我正在做的是(返回一个对象),首先:使用 url 中的 slug 获取 pkid,然后使用此信息 (pkid.id) 使用上面的查询集(在不同的模型上运行 - OnetToOne 键入 FinalModel)语句。

所以,简而言之,我首先使用slug(模型=FinalModel)提取PK,然后在另一个模型(queryset 模型)上使用这个PK,它是OneToOne 键入的FinalModel(使用 owner 属性)。

我不确定使用两个这样的语句对数据库是否有效(我也不是这方面的专家) - 我想知道是否有人可以建议我如何组合这两个语句(pkid 和 queryset ) 以更有效地获取最终对象。

抱歉,这是一个 django 101 问题。

【问题讨论】:

    标签: django django-models django-views


    【解决方案1】:

    如果您展示了您的模型,这将更容易回答。但假设 owner 是从 FinalModel 到您想要在最后获得的任何模型的 ForeignKey,您可以使用双下划线语法进行 JOIN:

    obj = MyModel.objects.get(owner__slug=slug)
    

    (注意你不需要指定exact,这是默认值。)

    【讨论】:

    • 非常感谢 - 效果很好!!我想知道是否可以再问你一个问题(可能与此不完全相关)。我想知道这个语句是做什么的:queryset = queryset.filter(**{slug_field: slug}) 特别是,**{slug_field: slug} 构造在这里是什么意思?非常感谢您的所有帮助 - 确实帮助我更好地理解。
    • **dict 只是将字典作为关键字参数传递的一种方式。这很有用,因为关键字名称本身可以是变量,就像您的示例一样,也可以是值。
    • 非常感谢。解决了所有问题 :) 将您的答案标记为正确!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-16
    • 1970-01-01
    相关资源
    最近更新 更多