动态实例特定的Django字段创建

时间:2018-09-27 00:57:31

标签: python mysql django django-models

我遇到的情况是,用户模型可能需要添加'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 个答案:

答案 0 :(得分:0)

如果您在Django / DB方面不是唯一的,则可以尝试使用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>]>

答案 1 :(得分:0)

不清楚您的问题是否完全是任意的“可能存在这些字段的任何组合”,是否存在使这些可能的组合更易于处理的子集,甚至是可能的完整字段甚至是预定义的,但您可能至少具有以下选项之一。

  1. 写一个单一的User类(或用户配置文件类),上面包含所有可能的字段,其中的字段可能在一个用户上,而另一个字段不在null=True上。
  2. 具有多种用户类型,可使用不同的字段扩展User(或其超类之一)。
  3. 在查询单个用户模型时,编写自定义管理器以(昂贵地)解压缩JSON或其他多值字段,以从查询中手动删除您的自定义字段并将其应用于初步结果集。
  4. 具有链接到您的User类的用户个人资料模型,然后将其子类化以添加各种可能的字段组合。

继承可以使这种情况变成一种真正的痛苦,所以我会避免...对于您所描述的情况,我认为#1可能是最合适的。如果您的用例不接受null=True,那么您的选项将变得不那么可口,可读性和可维护性。

注意:@henriquesalvaro的回答是在我撰写本文时出现的,它似乎优于以下选项。无论如何,我都会发布此消息,以防您无法使用JSONField。