Как заставить 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")