【问题标题】:Django: Loop over list of objects and save in model with ForeignKeyDjango:循环对象列表并使用 ForeignKey 保存在模型中
【发布时间】:2018-06-15 14:08:28
【问题描述】:

我正在尝试使用 Shamir's Secret Sharing 的 pycryptodome 实现。

当拆分共享时,输出是一个带有这种形式的元组的列表对象:

<class 'list'>: [(1, b'\x84\x16H\x92\xaaJ\xf7\x84_\xf9\x02\x03\x86\xff\xb7Z'), (2, b'\x86p\xbe5\xbfP\xe4\x00m\x16\xd3\t\xb3\xc8\xfa\x1f'), (3, b'xR\xecWLY\x15||\xb3\x9c\x0f\xa0\xda>\xa1'), (4, b'\x82\xbdS{\x95d\xc3\x08\x08\xc9q\x1d\xd9\xa6`\x95'), (5, b'|\x9f\x01\x19fm2t\x19l>\x1b\xca\xb4\xa4+')]

for 循环中的hexlify 之后,对象更具可读性:

for idx, share in shares:
    print ("index #%d: %s" % (idx, hexlify(share)))

index #1: b'84164892aa4af7845ff9020386ffb75a'
index #2: b'8670be35bf50e4006d16d309b3c8fa1f'
index #3: b'7852ec574c59157c7cb39c0fa0da3ea1'
index #4: b'82bd537b9564c30808c9711dd9a66095'

我有这个模型:

class MyModel(models.Model):
    user_id = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    some_other_id = models.ForeignKey(OtherModel, on_delete=models.CASCADE, null=True)
    encrypted_share = models.CharField(max_length=200, blank=True)

我想以某种方式过滤MyModel 以获得特定的some_other_id,然后为每个user_id 条目从列表对象中保存一个共享,该列表对象使用来自user_model 的用户public_key 进行加密。

这是我在views.py 中创建共享的方法:

number_of_users = MyModel.objects.filter(some_other_id=self.object.pk).count()
        minimum_shares = (number_of_users*7)//10

        shares = Shamir.split(minimum_shares, number_of_users, key)

编辑:

我将添加更多信息以使我想要实现的目标更加清晰。

基本上MyModel 是参与投票的用户列表。

我的models.py

class Poll(models.Model):
    question_text = models.CharField(max_length=200)
    public_key = models.CharField(max_length=30, blank=True)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, editable=False)

class EligibleVoters(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    poll = models.ForeignKey(Poll, on_delete=models.CASCADE, null=True)
    encrypted_keypart = models.CharField(max_length=200, blank=True)
    class Meta:
        unique_together = ["user", "poll"]

目前我有一个EligibleVoters 表,如下所示:

我还为每个poll 创建了一个RSA 密钥对。我想将密钥对的私有部分拆分为多个共享,并将每个共享保存在每个用户旁边。

因此,根据我发布的表格,对于pollpoll_id=1,我想过滤允许参与该投票的用户并计算他们,从而找出我必须拆分多少股私钥。

我这样做:

number_of_shares = EligibleVoters.objects.filter(poll=self.object.pk).count()

接下来我设置重建密钥所需的最小份额数(在我的情况下为 70%)。

我这样做:

minimum_shares = (number_of_shares*7)//10

接下来我将密钥拆分为共享:

shares = Shamir.split(minimum_shares, number_of_shares, private_key)

正如我在编辑之前所描述的,此函数为我提供了包含索引和共享的元组的 list

现在我想用poll_id=1 将每个共享保存在每个参与poll 的用户旁边(最好使用我的user_model 中每个userpublic_key 加密)。 最终得到这样的结果:

我希望现在这更有意义。

【问题讨论】:

  • 我不明白。您想为每个用户保存一个 MyModel 吗??
  • 如果要统计用户,那是不对的。因为可能一位用户拥有一个或多个 MyModel。
  • 我忘了在 MyModel 中添加 user_idsome_other_idunique_together。因此,通过特定的some_other_id 过滤并计数,我可以计算用户数。我会尝试更新我的问题,以使我想要更清楚。
  • 用户与 MyModel 的关系请使用 onetoone 而非外键
  • @MohammadAli 我编辑了我的问题

标签: python django django-models foreign-keys


【解决方案1】:
User.objects.filter(poll__id=1)

此代码为您提供投票 id 等于 1 的用户列表

你想要这个吗?

我无法想象你的 erd,我希望能理解你的场景

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 2013-04-10
    • 2020-12-18
    • 2020-01-04
    • 2012-12-25
    • 2011-11-10
    相关资源
    最近更新 更多