Python 检查元素是否存在

Python 检查元素是否存在,python,django,performance,Python,Django,Performance,我试图找出Django模型中是否存在元素。我认为这应该很容易做到,但在Django文档中找不到任何优雅的方式 我的问题是,我在一个目录中有数千个屏幕截图,需要检查它们是否在应该存储它们的数据库中。因此,我正在迭代文件名,并希望查看每个文件名是否存在对应的元素。有一个叫做截图的模型,我唯一能想到的就是 filenames = os.listdir(settings.SCREENSHOTS_ON_DISC) for filename in filenames: exists = Screen

我试图找出Django模型中是否存在元素。我认为这应该很容易做到,但在Django文档中找不到任何优雅的方式

我的问题是,我在一个目录中有数千个屏幕截图,需要检查它们是否在应该存储它们的数据库中。因此,我正在迭代文件名,并希望查看每个文件名是否存在对应的元素。有一个叫做截图的模型,我唯一能想到的就是

filenames = os.listdir(settings.SCREENSHOTS_ON_DISC)
for filename in filenames:
    exists = Screenshot.objects.filter(filename=filename)
    if exists:
        ...
有没有更好/更快的方法?请注意,一个屏幕截图可以多次出现在数据库中(因此我没有使用.get)。

您可以尝试:

Screenshot.objects.filter(filename__in = filenames)
这将为您提供一个所有屏幕截图的列表。你可以比较这两个列表,看看它们之间有什么不存在。这应该可以让您开始,但您可能需要调整查询的性能/使用。

您可以尝试:

Screenshot.objects.filter(filename__in = filenames)

这将为您提供一个所有屏幕截图的列表。你可以比较这两个列表,看看它们之间有什么不存在。这应该可以让您开始,但您可能需要调整查询的性能/使用。

如果您的
屏幕截图
模型有很多属性,那么您显示的代码正在为您的特定需要做不必要的工作。例如,您可以执行以下操作:

files_in_db = Screenshot.objects.values_list('filename', flat=True).distinct()
这将为您提供数据库中所有文件名的列表,并生成SQL以仅获取文件名。它不会尝试创建和填充屏幕截图对象。如果你有

files_on_disc = os.listdir(settings.SCREENSHOTS_ON_DISC)

然后,您可以在一个列表上迭代以查找另一个列表中的成员资格,或者将一个或两个列表分成多个集合以查找常见成员等。

如果您的
屏幕截图
模型具有许多属性,则您显示的代码正在为您的特定需要做不必要的工作。例如,您可以执行以下操作:

files_in_db = Screenshot.objects.values_list('filename', flat=True).distinct()
这将为您提供数据库中所有文件名的列表,并生成SQL以仅获取文件名。它不会尝试创建和填充屏幕截图对象。如果你有

files_on_disc = os.listdir(settings.SCREENSHOTS_ON_DISC)

然后,您可以在一个列表上迭代以查找另一个列表中的成员资格,或者将一个或两个列表放入集合中以查找常见成员等。

此查询将获取数据库和文件系统中的所有文件:

discfiles = os.listdir(settings.SCREENSHOTS_ON_DISC)

filenames = (Screenshot.objects.filter(filename__in=discfiles)
                               .values_list('filename', flat=True)
                               .order_by('filename')
                               .distinct())
请按记下订单。如果在模型定义中指定了顺序,则使用
distinct
可能无法返回预期的结果。这里记录了这一点:


因此,明确顺序,然后执行查询。

此查询将获取数据库和文件系统中的所有文件:

discfiles = os.listdir(settings.SCREENSHOTS_ON_DISC)

filenames = (Screenshot.objects.filter(filename__in=discfiles)
                               .values_list('filename', flat=True)
                               .order_by('filename')
                               .distinct())
请按记下订单。如果在模型定义中指定了顺序,则使用
distinct
可能无法返回预期的结果。这里记录了这一点:

因此,明确排序,然后执行查询