Django:循环对象列表并使用ForeignKey

时间:2018-06-15 14:08:28

标签: python django django-models foreign-keys

我正在尝试使用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+')]

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

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条目保存一个共享来自列出的对象,该用户的public_key取自user_model

以下是我在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表,如下所示:

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

因此,根据我发布的表格,对于poll poll_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的每个用户旁边的每个共享poll_id=1(最好使用public_key user来自user_model加密}})。 结束这样的事情:

我希望现在更有意义。

1 个答案:

答案 0 :(得分:0)

User.objects.filter(poll__id=1)

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

你想要这个吗?

我无法想象你的错误,我希望了解你的情景