我有一种情况,一个用户模型可以有'x'个需要添加的唯一字段。这些字段需要在其上运行查询,所以我不能只向其中添加包含json字符串的字段。例如,一个用户可能看起来像:
class User(models.Model):
name = models.CharField()
age = models.IntegerField()
sex = models.CharField()
profession = models.CharField()
下一个可能是:
class User(models.Model):
name = models.CharField()
age = models.IntegerField()
sex = models.CharField()
badge_number = models.IntegerField()
就像我上面说的,这些独特的字段必须是可查询的。救命!!
2条答案
按热度按时间rlcwz9us1#
从您的问题中不清楚这些是否完全是任意的“这些字段的任何组合都可能存在”,是否存在使可能的组合更容易处理的子集,或者甚至可能的字段的完整集合甚至是预定义的,但是您可能至少有以下选项之一。
编写一个用户类(或用户配置文件类),其中包含所有可能的字段,并将一个用户上但另一个用户上的字段设置为
null=True
.有多个用户类型用不同的字段扩展user(或它的一个超类)。
在查询单用户模型时,编写一个自定义管理器(代价高昂)解压json或其他多值字段,以便从查询中手动删除自定义字段并将其应用于初步结果集。
将一个用户配置文件模型链接到您的用户类,然后将其子类化以添加各种可能字段的组合。
遗传会把这种情况变成真正的痛苦,所以我会避免。。。对于您描述的情况,我认为1可能是最合适的。如果
null=True
对于您的用例是不可接受的,您的选项变得不那么容易接受、可读和可维护。注意:@henriquesalvaro的答案是在我写这篇文章的时候得到的,似乎比下面的选项要好。不管怎样,我还是要发布这个,以防jsonfield不是你可以使用的东西。
tzdcorbm2#
如果你不是指django/db意义上的unique,你可以尝试使用postgres
JSONField
,一个存储json并可查询的字段。文档中的示例代码:
以及查询: