使用Django ORM,如何为所有可能的组合创建唯一的哈希

时间:2017-06-19 22:13:54

标签: python django django-models

我希望为模型中的每个选项组合维护一个具有唯一ID的Django模型。然后,我希望能够使用新字段更新模型,而不是之前的唯一ID更改。 id可以是散列或整数或任何东西。 实现这一目标的最佳方法是什么?

class MyModel(models.Model):
    WINDOW_MIN = 5
    WINDOW_MAX = 7
    WINDOW_CHOICES = [(i,i) for i in range(WINDOW_MIN - 1, WINDOW_MAX - 1)]
    window = models.PositiveIntegerField('Window', editable=True, default=WINDOW_MIN, choices=WINDOW_CHOICES)
    is_live = models.BooleanField('Live', editable=True, default=False)
    unique_id = ....

鉴于以上示例,将有3 * 2 == 6个唯一ID。如果我添加另一个可编辑的布尔字段,我不想更改以前的唯一ID,但我希望为新的布尔字段生成新的唯一ID。

这背后的思考过程是MyModel中的参数定义函数的输入,该函数的结果由unique_id和模型的名称存储在另一个Django模型MyResultModel中。这背后的原因是MyModel有多个变体,每个变量都有自己设置的唯一组合,它们会定期更新,但MyResultModel中的结果集在MyModel1和MyModelN之间是相同的。理想情况下,我希望unique_id是自动生成的。换句话说,MyResultModel中存储的结果集的键是model_name(MyModel)和unique_id。我希望将这么多(MyModel1,... MyModelN)理解为一个(MyResultModel)关系。

class MyResultModel(models.Model):
    unique_id = ...
    model_name = models.CharField(max_length=200, default='', blank=False) # Points to a Django Model ex MyModel
    result1 = ...
    result2 = ...

3 个答案:

答案 0 :(得分:4)

一种常见的方法,假设您的所有选项都是布尔值,分类或小数字,您可以将它们打包到更大的位字段(https://en.wikipedia.org/wiki/Bit_field),并且每当您添加新选项时,请确保将其推送到你的位字段最重要的部分,并避免值为0(也就是说,简单地添加1到任何东西)。每个unique_id不仅代表不同的配置,甚至可以不使用模型,只需使用位操作从位字段中提取所有值。

答案 1 :(得分:1)

我有两件事: 首先,如果您只想为所有组合创建唯一的哈希

# Just set it all together like
uniq= cb1+cb2+cb3... (a string key is ok =) )
# If it is very very long string ~> we think about using hash to short it (and have same size for all value).

接下来:

对于您的上述问题:

我无法理解你为什么要把模型变成一个复杂的东西(就像乱七八糟的东西)但仍然需要解决它:

当我读到你的问题:你有很多型号的变种〜>想把它收集到1个模型中吗?

所以: 最好设置FK

map = models.ForeignKey(Model_name, null=True)
# but if you have too many model, it can't be help...

所以我建议:

〜只创建一个模型,因为如果你有太多的模型,你甚至不能调用它来获取数据(正如你所做的那样)但是当你添加更多的FIELD时,唯一的id~>应该改变。

拥有特殊unique_id的一个好方法:

使用我说的第一个解决方案。

或者:

创建表只是为了存储您的COMBO:

新表将包含ALL字段,您将为每个字段设置SET值(或者您可以编写脚本来创建它)。 〜>你有每个组合的id~> 与唯一ID相同

你可以创建所有可能的组合,或只是在新组合出现时检查和添加

答案 2 :(得分:0)

另一种可能的解决方案是存储参数JsonField

https://bitbucket.org/schinckel/django-jsonfield