0

我有数据库表,我的文件夹或类别存储在表中

class Node和文件存储在类中File

NodeFile模型中,我有一个名为keywhich 的字段是来自 amazon s3 文件的字符串键

喜欢

mybucket/files/pdf/abc.pdf

我通过运行自定义构建 python 函数来更新数据库。

现在我想要查看亚马逊 S3 上的哪些文件已更改或删除,或者添加了哪些新文件。

简而言之,我将拥有像这样的所有亚马逊钥匙的列表 s3_keys

mybucket/files/pdf/abc.pdf
mybucket/files/pdf/abc2.pdf
mybucket/files/pdf/abc3.pdf
mybucket/files/pdf/abc4.pdf
mybucket/files/pdf/new/
mybucket/files/pdf/new/abc.pdf
mybucket/files/pdf/2011/

然后我将有两个数据库表中的键,即NodeFile

我想要那个 somwhow 我可以比较s3_keys数据库中的 key 字段,然后如果

  1. 钥匙是一样的然后它不会做任何事情
  2. 密钥在 s3 上而不是在数据库中然后我输入new_list
  3. 如果键在数据库中而不是在 s3 中,那么我有delete_list

然后我可以对它们进行操作

解决这个问题的最佳方法是什么

更新:

我想有三个列表

Nodes_List = [(pk, key), .....]
File_List = [(pk, key), .....]
s3_keys = [key1, key2, .....]

我必须过滤掉元素

4

1 回答 1

1

既然您说您的表很小,您可以执行以下操作。我假设您可以通过使用原始查询做得更好,但您可以考虑以下方法(希望代码不包含错误)。

s3_keys = [s3 键列表]

现在您要删除所有不在 s3 键中的条目,我认为这很简单:

File.objects.exclude(id___in=s3_keys).delete()
Node.objects.exclude(id___in=s3_keys).delete()

现在您想将不在列表中的 s3 添加到数据库中:

#Bring all entries and make them to a set:
db_keys = set(File.objects.all().values_list('key',flat=True))
# find the new keys
new_db_keys = set(s3_keys) - db_keys

现在做批量创建

new_nodes = []
new_files = []
for key in new db_keys:
   new_nodes.append(Node(key=key))
   new_files.append(File(key=key))
Node.objects.bulk_create(new_nodes)
File.objects.bulk_create(new_files)
于 2013-06-28T09:18:40.310 回答