0

我有一个带有几个子类型的 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'

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

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

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

谢谢!

4

1 回答 1

0

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

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字段并添加了一个漂亮的打印方法来处理引用类上的类型标签。

于 2021-08-18T04:04:30.983 回答