14

Is there an efficient way to exclude fields from the function values() or values_list.

e.g

Videos.objects.filter(id=1).get().values()

I want to exclude from this queryset the field duration.

I know that I can specify fields what I want to have in the result but what if I want everything but only one field not. Like in the cases if I have 20 fields and if I want only one from them not.

Thanks

Azd325
  • 5,024
  • 5
  • 33
  • 53

2 Answers2

30

You must use defer This will not add defined fields to your select query.

Videos.objects.filter(...).defer('duration')
Pramod
  • 5,000
  • 3
  • 41
  • 43
FallenAngel
  • 17,186
  • 14
  • 82
  • 110
  • 1
    Before using `defer()`, read the [note in the documentation](https://docs.djangoproject.com/en/stable/ref/models/querysets/#defer): it's intended for advanced use-cases. – natka_m Aug 18 '20 at 12:35
18

You can get all fields first, then pop out the fields you do not want:

fields = Video._meta.get_all_field_names()
fields.remove('id')
Video.object.filter(...).values(*fields)
iMom0
  • 11,861
  • 3
  • 48
  • 60
  • 3
    To get the field names directly you can use: ``Video._meta.get_all_field_names()`` – codeape May 31 '13 at 10:09
  • 1
    The `get_all_field_names()` method was deprecated some time ago and removed. Now you have to do: `[f.name for f in Video._meta.get_fields()]`, see this answer: https://stackoverflow.com/a/3106314/4744341 – natka_m Aug 18 '20 at 12:48