【问题标题】:Python/Django: Creating a simpler list from values_list()Python/Django:从 values_list() 创建一个更简单的列表
【发布时间】:2010-10-16 12:21:04
【问题描述】:

考虑:

>>>jr.operators.values_list('id')
[(1,), (2,), (3,)]

如何进一步简化为:

['1', '2', '3']

目的:

class ActivityForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super(ActivityForm, self).__init__(*args, **kwargs)
        if self.initial['job_record']:
            jr = JobRecord.objects.get(pk=self.initial['job_record'])

            # Operators
            self.fields['operators'].queryset = jr.operators

            # select all operators by default
            self.initial['operators'] = jr.operators.values_list('id') # refined as above.

【问题讨论】:

    标签: python django


    【解决方案1】:

    使用 django 查询集的 flat=True 构造:https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.values_list

    来自文档中的示例:

    >>> Entry.objects.values_list('id', flat=True).order_by('id')
    [1, 2, 3, ...]
    

    【讨论】:

    • 这个解决方案返回一个整数列表。要按照 OP 的要求获得像 ['1', '2', '3'] 这样的字符串列表,您需要执行 map(str, Entry.objects.values_list('id', flat=True).order_by('id'))
    • 当您根据 OP 的问题只有一个值时,此方法有效。有多个值,可以使用list(queryset.iterator())
    • 我可以获得多个值,例如 Entry.objects.values_list('id', 'name',flat=True) 但 flat=True 仅适用于单个值而不适用于多个值。如何克服这个问题?
    • 我只能使用 list( Entry.objects.values_list('id', flat=True) ) 使其工作
    【解决方案2】:

    你需要做..来得到这个输出 ['1', '2', '3']

    map(str, Entry.objects.values_list('id', flat=True).order_by('id'))

    【讨论】:

      【解决方案3】:

      您可以使用列表推导:

      >>> mylist = [(1,), (2,), (3,)] >>> [str(x[0]) for x in mylist] ['1', '2', '3']

      【讨论】:

        【解决方案4】:

        这样的?

        x = [(1,), (2,), (3,)]
        y = [str(i[0]) for i in x]
        ['1', '2', '3']
        

        【讨论】:

        • 这是对 django 中可用 API 的重新实现,将比 django 生成的 SQL 查询慢得多
        猜你喜欢
        • 1970-01-01
        • 2015-09-18
        • 1970-01-01
        • 2016-11-21
        • 1970-01-01
        • 2019-06-03
        • 2016-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多