代码之家  ›  专栏  ›  技术社区  ›  Visgean Skeloru

仅包括Django模型中的字段。

  •  1
  • Visgean Skeloru  · 技术社区  · 8 年前

    我有一个django只读模型,它有一个包含geojson数据的列,这个字段很容易是500MB。

    大多数情况下,我不需要处理这个字段,所以我希望它从标准的select查询中排除。有什么方法可以排除它吗?我知道我可以排除它 values_list 但我对违约行为更感兴趣?

    1 回复  |  直到 8 年前
        1
  •  3
  •   willeM_ Van Onsem    8 年前

    在查询集级别

    你可以使用 .defer('field1', 'field2') [Django-doc] 防止Django获取某些字段 立即 . 在这种情况下,以后可以用一个额外的查询来获取它们。

    因此,您可以编写如下查询:

    SomeModel.objects.all().defer('geo_field')
    

    将其从提取中排除。然后查询集包含 SomeModel 对象,因此不是值列表。你定义的行为 体模 (例如,实用方法)可以使用。而且你还是 可以 使用 some_model_object.geo_field ,但在您可以访问相应的值之前,它将需要一个额外的提取。

    然而,建议 只有 如果某些列的处理非常重要,请使用这些技巧。毕竟,这种额外的查询也需要时间。如果您经常需要这样的字段,通常只会导致处理成本更高。

    构建自定义 Manager

    以上当然不是很优雅:现在我们要写 .defer(..) 对于每个查询。但是,我们可以设计一个在访问时自动推迟的管理器。 SomeModel.objects :

    from django.db import models
    
    class GeoManager(models.Manager):
        def get_queryset(self):
            return super().get_queryset().defer('geo_field')
    

    然后在 体模 我们可以用这个经理 objects 而不是默认的:

    class SomeModel(models.Model):
        geo_field = ...
    
        objects = GeoManager()
        with_geofield = models.Manager()
    

    因此,默认情况下,您将不获取 geo_field 如果您访问 somemodel.objects(某些模型对象) 如果你知道你需要它,你可以用 SomeModel.with_geofield 立即取 地磁场 也。

    推荐文章