Python 在Django get_object_或_404中选择特定字段
我在Django有一个模型,有太多字段。 例: 现在我需要基于id获取细节视图。我见过很多方法,比如Python 在Django get_object_或_404中选择特定字段,python,sql,django,django-models,model,Python,Sql,Django,Django Models,Model,我在Django有一个模型,有太多字段。 例: 现在我需要基于id获取细节视图。我见过很多方法,比如 obj = MyModel.objects.get(pk=5) obj = MyModel.objects.filter(pk=5)[0] obj = get_object_or_404(MyModel, pk=1) 最后一种方法最适合,因为我可以在不更改任何代码的情况下提供404错误。但我只需要参数1和参数2。因此我需要一个类似于 SELECT "param_1" FROM mymodel
obj = MyModel.objects.get(pk=5)
obj = MyModel.objects.filter(pk=5)[0]
obj = get_object_or_404(MyModel, pk=1)
最后一种方法最适合,因为我可以在不更改任何代码的情况下提供404错误。但我只需要参数1和参数2。因此我需要一个类似于
SELECT "param_1" FROM mymodel WHERE pk=1
如何使用get_object_或_404实现这一点
有人能帮我找到解决方案吗?的第一个参数是模型的类名,所有其他参数都是要传递给get的参数。所以这里不能使用它,但是模仿它的功能非常简单
def get_object_or_404_custom(klass,fields = None, *args, **kwargs):
queryset = _get_queryset(klass)
try:
if fields:
queryset = queryset.only(*fields)
return queryset.get(*args, **kwargs)
except AttributeError:
klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
raise ValueError(
"First argument to get_object_or_404() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
except queryset.model.DoesNotExist:
raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
基于:获取对象或404的第一个参数可以是: 必需参数 klass 一个模型类、一个管理器或一个QuerySet实例 获取对象 因此,您所要做的就是传入一个预筛选的查询集,例如由以下返回的查询集:
所以在get或get\u object\u或\u 404中没有类似的值吗?不,该函数不支持它,但是在某个地方添加此代码,您就有了自己版本的get\u object\u或\u 404!不需要这样做,因为该功能已经内置到该方法中。@Burnkhalid该死!我读了源代码,但没有评论+为了你的回答,我试过了。但我也得到了obj.param_20的值
def get_object_or_404_custom(klass,fields = None, *args, **kwargs):
queryset = _get_queryset(klass)
try:
if fields:
queryset = queryset.only(*fields)
return queryset.get(*args, **kwargs)
except AttributeError:
klass__name = klass.__name__ if isinstance(klass, type) else klass.__class__.__name__
raise ValueError(
"First argument to get_object_or_404() must be a Model, Manager, "
"or QuerySet, not '%s'." % klass__name
)
except queryset.model.DoesNotExist:
raise Http404('No %s matches the given query.' % queryset.model._meta.object_name)
obj = get_object_or_404(MyModel.objects.only('param_1', 'param_2'), pk=1)