У меня есть несколько моделей с такими полями, как «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, который я могу использовать во всех моделях.
Пример:
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)