特定于动态示例的django字段创建

wnvonmuf  于 2021-06-18  发布在  Mysql
关注(0)|答案(2)|浏览(317)

我有一种情况,一个用户模型可以有'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()

就像我上面说的,这些独特的字段必须是可查询的。救命!!

rlcwz9us

rlcwz9us1#

从您的问题中不清楚这些是否完全是任意的“这些字段的任何组合都可能存在”,是否存在使可能的组合更容易处理的子集,或者甚至可能的字段的完整集合甚至是预定义的,但是您可能至少有以下选项之一。
编写一个用户类(或用户配置文件类),其中包含所有可能的字段,并将一个用户上但另一个用户上的字段设置为 null=True .
有多个用户类型用不同的字段扩展user(或它的一个超类)。
在查询单用户模型时,编写一个自定义管理器(代价高昂)解压json或其他多值字段,以便从查询中手动删除自定义字段并将其应用于初步结果集。
将一个用户配置文件模型链接到您的用户类,然后将其子类化以添加各种可能字段的组合。
遗传会把这种情况变成真正的痛苦,所以我会避免。。。对于您描述的情况,我认为1可能是最合适的。如果 null=True 对于您的用例是不可接受的,您的选项变得不那么容易接受、可读和可维护。
注意:@henriquesalvaro的答案是在我写这篇文章的时候得到的,似乎比下面的选项要好。不管怎样,我还是要发布这个,以防jsonfield不是你可以使用的东西。

tzdcorbm

tzdcorbm2#

如果你不是指django/db意义上的unique,你可以尝试使用postgres JSONField ,一个存储json并可查询的字段。
文档中的示例代码:

from django.contrib.postgres.fields import JSONField
from django.db import models

class Dog(models.Model):
    name = models.CharField(max_length=200)
    data = JSONField()

    def __str__(self):
        return self.name

以及查询:

>>> Dog.objects.create(name='Rufus', data={
...     'breed': 'labrador',
...     'owner': {
...         'name': 'Bob',
...         'other_pets': [{
...             'name': 'Fishy',
...         }],
...     },
... })
>>> Dog.objects.create(name='Meg', data={'breed': 'collie', 'owner': None})

>>> Dog.objects.filter(data__breed='collie')
<QuerySet [<Dog: Meg>]>

相关问题