如何让Django values()排除一些字段?

jv4diomz  于 2022-11-18  发布在  Go
关注(0)|答案(2)|浏览(230)

我有多个模型,其中包含“created_at”“updated_at”等字段,我不想使用objects.values()获得这些字段。
Django有办法排除values()中的字段吗?
我知道人们引用defer(),但它不像values()那样返回QuerySet<Dict>,而是返回QuerySet<Model>
我尝试了objects.defer("created_at", "updated_at").values(),但它在生成的Dict中包含了这2个延迟字段。
我看到defer().query只选择SQL中的非排除字段,但使用defer(..).values()重置延迟字段并选择
所有
字段。
我不能指定我想要的字段,因为不同的型号有不同的字段,我只能指定我不想要的字段。所以我不能使用values('name', 'age', ...)
我计划使用一个CustomomeManager,我可以在所有模型中使用它。
示例:

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中有没有什么方法,或者我必须从values()的结果Dict中手动删除这些键?

qjp7pelc

qjp7pelc1#

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)
jaql4c8m

jaql4c8m2#

这应该可行:

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)

相关问题