2016-09-19 43 views
0

我在Django中有一个模型,字段太多。 例如:在Django中选择特定的字段get_object_or_404

class MyModel(models.Model): 
    param_1 = models.CharField(max_length=100) 
    ... 
    param_25 = models.CharField(max_length=100) 

现在我需要得到基于id的详细视图。我见过可能的方法,如

obj = MyModel.objects.get(pk=5) 
obj = MyModel.objects.filter(pk=5)[0] 
obj = get_object_or_404(MyModel, pk=1) 

最后一种方法最适合,因为我可以提供404错误,无需任何代码更改。但我只需要param_1和param_2。因此,我需要类似的查询,

SELECT "param_1" FROM mymodel WHERE pk=1 

这怎么可以使用get_object_or_404来完成?

有人可以帮助找到解决方案吗?

回答

4

的第一个参数get_object_or_404可以a Model, a Manager or a QuerySet

必需的参数

克拉斯

模型类,一个经理,或从中获取对象的QuerySet实例,其中 。

所以,你所要做的就是通过在预过滤查询集,如一个由only返回:

obj = get_object_or_404(MyModel.objects.only('param_1', 'param_2'), pk=1) 
+0

我试过了。但我越来越obj.param_20值也 –

+0

对不起。我的错。有用。谢谢 –

1

第一个参数是模型的类名,所有其他参数都是传递给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) 

上:https://docs.djangoproject.com/en/1.10/_modules/django/shortcuts/#get_object_or_404

+0

所以没有办法在GET或get_object_or_404类似值? –

+0

没有该功能不支持它,但添加此代码的地方,你有你自己的版本的get_object_or_404! – e4c5

+0

不需要这样做,因为该功能已经内置于该方法中。 –