【问题标题】:Using the Django ORM, How can you create a unique hash for all possible combinations使用 Django ORM,如何为所有可能的组合创建唯一哈希
【发布时间】:2017-11-22 06:33:11
【问题描述】:

我想为模型中的每个选项组合维护一个具有唯一 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 = ...

【问题讨论】:

  • 这对我来说就像XY problem。你这样做是为了达到什么目的?
  • @Chris 我将添加更多信息,说明为什么我认为上述内容是有道理的。
  • 我同意@Chris 的评论,不过,我会尽量回答。
  • @Chris 我添加了很多,让我知道这是否有意义,或者我是否以完全错误的方式考虑这个问题。
  • 我的意思是你会做这样的事情:MyResultModel.objects.get(model_name='MyModel', unique_id=MyModel.objects.get(window=6, is_live=True).id).

标签: python django django-models


【解决方案1】:

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

【讨论】:

  • 有一个github.com/disqus/django-bitfield 现在我只需要研究如何自动生成它们,而不会在添加新字段时丢失旧的。
  • 我对此并不熟悉,但从文档来看,快速浏览一下,它似乎只适用于布尔标志。相同的想法,您可以使用这种方法保存完整的“模型”,但您需要对其进行调整才能存储数字。
  • 是的,看来我真的可以使用这个包github.com/goodmase/django-bitfield-manager
【解决方案2】:

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

# 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...

所以我建议:

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

获得特殊 unique_id 的一种好方法:

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

或者:

创建 NEW 表只是为了存储您的组合:

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

您可以创建所有可能的组合,或者在新组合出现时检查并添加

【讨论】:

  • 一件事要小心(添加新字段时,您必须设置默认值或将其设置为 NULL-able)
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-04
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 2015-02-19
    相关资源
    最近更新 更多