Как заставить Django values() исключить некоторые поля?

У меня есть несколько моделей, которые имеют поля типа "created_at" "updated_at", которые я не хочу получать с помощью objects.values()

Есть ли в Django способ исключить поля в values().

Я знаю, что люди ссылаются на defer(), но он не возвращает QuerySet<Dict>, как values(), а возвращает QuerySet<Model>.

Я пробовал objects.defer("created_at", "updated_at").values(), но он включает эти 2 отложенных поля в результирующий Dict.

Я вижу, что defer().query выбирает только неисключенные поля в SQL, но использование defer(..).values() сбрасывает отложенные поля и выбирает все поля.

Я не могу указать, какое поле мне нужно, поскольку разные модели имеют разные поля, я могу только указать, какие поля мне не нужны. Поэтому я не могу использовать values('name', 'age', ...)

Я планирую использовать CustomeManager, который я могу использовать во всех моделях.

Eg:

class CustomManager(models.Manager):
    def values_excluded(self):
        return self.values() # somehow exlude the fields and return QuerySet<Dict>

class ExampleModel(models.Model):
    name = models.CharField(max_length=20)
    age = models.IntegerField()
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()
    objects = CustomManager()

ExampleModel.objects.values_excluded()

Есть ли способ в Django или я должен вручную удалить эти ключи из результирующего Dict из values()?

esclude_fields = ['created_at', 'updated_at']
keys = [f.name for f in Model._meta.local_fields if f.name not in esclude_fields]
queryset.values(*keys)

Это должно работать:

class CustomManager(models.Manager):

    def values_excluded(self, *excluded_fields):
        included_fields = [f.name for f in self.model._meta.fields if f.name not in excluded_fields]
        return self.values(*included_fields)

просто укажите поля, которые вы хотите получить, и проигнорируйте те, которые не нужны. Просто

ExampleModel.objects.all().values("name", "age")
Вернуться на верх