django数据库在两种模型上的高效查询集
我是django的新手,我想知道是否可以使用ORM更有效地进行以下查询:django数据库在两种模型上的高效查询集,django,django-models,django-views,Django,Django Models,Django Views,我是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 = querys
# 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
)使用queryset获取正确的完整对象(它在不同的模型上运行-这是OnetToOne
键控到上面的FinalModel
)语句
因此,简而言之,我首先使用slug
(Model=FinalModel)提取PK
,然后在另一个模型(queryset
模型)上使用该PK
,该模型是OneToOne
键控到FinalModel
(使用owner
属性)
我不确定使用两个这样的语句对DB是否有效(我也不是这方面的专家),我想知道是否有人可以建议我如何组合这两个语句(pkid
和queryset
)以更有效地获得最终对象
如果这是django 101的问题,很抱歉。如果您展示了您的模型,这将更容易回答。但是假设
owner
是从FinalModel到最终想要得到的任何模型的外键,您可以使用双下划线语法进行连接:
obj = MyModel.objects.get(owner__slug=slug)
(请注意,您不需要指定
精确的
,这是默认设置。)非常感谢这一点-这非常有效!!我想知道我是否可以问你另一个问题(可能与此不完全相关)。我想知道这个语句的作用是什么:queryset=queryset.filter(**{slug\u field:slug})
特别是,**{slug\u field:slug}
构造在这里意味着什么?非常感谢您的帮助,这确实帮助我更好地理解了。**dict
只是一种将字典作为关键字参数传递的方法。这很有用,因为关键字名称本身可以是一个变量,就像在您的示例中一样,也可以是值。非常感谢。解决了所有问题:)将您的答案标记为正确!