【问题标题】:Using django-polymorphic type information in query expressions在查询表达式中使用 django 多态类型信息
【发布时间】:2021-08-11 02:10:12
【问题描述】:

我有一个带有几个子类型的 django 模型,直到现在我一直在明确处理这些子类型。每条记录由三个字段唯一标识:

class Entity:
    type = CharField(max_length=3)
    released_at = DateTimeField()
    number = IntegerField()

我使用查询表达式将其组合成单个字符串以用于搜索和注释结果:

entity_uid_expr = Case(
    When(
        number=None,
        then=Value(None),
    ),
    default=Concat(
        'type', ExtractYear('released_at'), 'number',
        output_field=CharField()
    ),
    output_field=CharField()
)

到目前为止,这工作得很好,但现在这两个子类型的差异很大,使用多态模型将它们作为子类处理会更容易。我想做的是这样的:

class Entity:
    released_at = DateTimeField()
    number = IntegerField()

class EntityA(Entity):
    type = 'A'

class EntityB(Entity):
    type = 'B'

但这会从数据库中删除类型信息并破坏查询表达式。

是否可以根据多态类设置字段的默认值?我能想到的唯一其他选择是将其隐藏起来,并在保存时使用正确的值自动填充它。

这是一种可行的方法还是我错过了什么?

谢谢!

【问题讨论】:

    标签: django django-polymorphic


    【解决方案1】:

    解决方案非常简单:我只需要使用多态类型数据而不是我自己的手工构建类型,它提供了我需要的相同唯一性/排序/过滤。

    entity_uid_expr = Case(
        When(
            number=None,
            then=Value(None),
        ),
        default=Concat(
            'polymorphic_ctype_id', ExtractYear('released_at'), 'number',
            output_field=CharField()
        ),
        output_field=CharField()
    )
    

    然后我从模型中删除了我的 type 字段,并添加了一个漂亮的打印方法来处理引用类上的类型标签。

    【讨论】:

      猜你喜欢
      • 2020-04-15
      • 2011-03-16
      • 2012-04-30
      • 1970-01-01
      • 2014-12-05
      • 2013-04-27
      • 2020-10-17
      • 1970-01-01
      • 2013-03-05
      相关资源
      最近更新 更多