【问题标题】:A pythonic way to get a list filtered by a Django table一种获取由 Django 表过滤的列表的pythonic方法
【发布时间】:2019-09-11 02:17:42
【问题描述】:

我需要过滤这样的列表:A = ['a','b','c','c','d','e'] 我有一个 Django 模型 T 包含一个字段 unique ,我知道元素是否相同。可以说T(id, name_unique,...others_fields)。 假设 T 有

id, name...
(1, 'b',...)
(2, 'c',...)
(3, 'f',...)
(4, 'g',...)
and alot rows more

我需要一种方法(pythonic)来获取一个列表 A 由 name_unique 中的不同且不重复过滤,所以输出应该是

A' = ['a', 'd', 'e']

【问题讨论】:

    标签: django python-2.7


    【解决方案1】:

    您可以使用set() 从 value_list 创建一个唯一列表,并对其进行设置类型操作。 https://docs.python.org/3/tutorial/datastructures.html#sets

    a = ['a','b','c','c','d','e']
    a_set = Set(to_filter )
    
    unique_names = MyModel.objects.values_list('name_unique', flat=True)
    unique_names_set = Set(unique_names )
    
    result = a_set.difference(unique_names_set)
    

    这样做的副作用是它会渲染 values 列表,如果列表太大而无法一次变成一个集合,您可以使用迭代器。

    编辑:这是一个带有迭代器的解决方案:

    list=['a','b','c','d']
    for m in Models.objects.all().iterator():
        list.remove(m.unique_name)
    

    【讨论】:

    • 好一个!我可以使用 IN 语句过滤 values_list 吗?如果我可以通过数据库查询进行过滤,MyModel.objects 可能太大了,对吧?
    • 你可以肯定地过滤它。您还可以使用 MyModel.objects.all().iterator() 在 for 循环或列表理解中对每个对象执行一个查询。我添加到答案中
    猜你喜欢
    • 2023-02-13
    • 2013-09-10
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多