【问题标题】:Howto build a field value in a Model derived from values in another Model如何在模型中构建从另一个模型中的值派生的字段值
【发布时间】:2016-03-29 16:32:54
【问题描述】:

系统的模型有一个政党模型

class Party(models.Model):
    name = models.CharField(max_length=128)
    our_reference = models.CharField(max_length=128)

彼得是一个党,另一个同名的人也叫彼得。字段“our_reference”应使用前三个字符,后跟一个 int,如 PET1。第二个彼得将是 PET2。添加了第三个人,称为 Petras。他将成为 PET3。

使用 Levenshtein 模块 (https://rawgit.com/ztane/python-Levenshtein/master/docs/Levenshtein.html) 我们需要在插入一方时测试该方是否已经存在,例如 -

def get_similar_items(mod, field, string, similarity_ratio=0.6, limit=None): """ Get similar items for a specific model Example usage: similar = get_similar_items(Entry, 'title', 'Espresso is good for you', 0.5, 10) var = Entry.objects.filter(id__in=similar) """ similar_list_id = [] v = ContentType.objects.get_for_model(mod) c = v.model_class() for i in c.objects.all(): if ratio(string, getattr(i,field)) > similarity_ratio: similar_list_id.append(i.id) return similar_list_id[:limit] 见于https://djangosnippets.org/snippets/288/

如果派对存在,不要使用新的 int 编号,而是使用旧的,即 PET1 作为参考。如果该方不存在,则制作一个新的参考 PET4。

对问题进行了编辑,以使用例更清晰。如何实施?

【问题讨论】:

  • 最终决定采用一个简单的解决方案 - 使用 knelson 建议的 UUID 和正常的 postgres 序列。 code

标签: python django django-models exists distinct-values


【解决方案1】:

听起来与其在一个名为 our_reference 的字段中添加派对的首字母和指令编号,不如只保存参考号,因为您可以将首字母从 fk 拉到派对。

这将使增加指令编号变得更加容易。

所以将our_reference 改为一个int 字段。

每当您想添加新案例时,请检查该派对是否已经存在。您可能希望有一个标识符,而不是仅按名称,因为两个人可以有相同的名字。

如果派对不存在,则创建一个并获取名称的前三个字符str(party.name[3:]).upper()

要获得新的指令编号,您可以找到该方已经使用related_names 的所有指令。

写一些类似的东西:

new_instruction_number_for_party = max(party.instructions.all().values_list('our_reference')) + 1

最后,在模板中显示总文件引用时,将our_reference 和前三个字母添加到上下文中,并在模板中放入{{ party_initials }}{{ num_of_initial }}/{{ our_reference }}

【讨论】:

  • 使用了 UUID,因此外键无法开箱即用 - 我的理解是 UUID 更适合多租户平台。会给你的方法一个bash,如果可以的话,会发布一个解决方案。
  • 我要回到原来的问题,因为这是正确的方法。 @knelson 说您可能希望拥有一个标识符,而不仅仅是名称,因为两个人可以有相同的名字。这就是我想说的;许多人拥有相同的姓名和姓氏,组织也是如此。因此,也许一个人/组织由标识符的第一部分标识,即 DOE1。 DOE2 将识别另一个同名的人。 DOE1中可以有多个文件,DOE2也一样。
  • name_tools 提供了两个名称之间相似性的度量。也许使用python_nameparser 处理连接的字段,然后传递给name_tools 以检查该人是否存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2021-04-30
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 2020-06-15
  • 2016-01-02
相关资源
最近更新 更多