def METHOD_NAME(self, queryset, **options):
    """
    Uses self.columns, containing fieldnames to produce the CSV.
    The header of the csv is made of the verbose name of each field.
    """
    model_blade = signage_models.Blade
    columns = options.pop('fields')
    columns_lines = options.pop('line_fields')
    model_line = signage_models.Line
    stream = options.pop('stream')
    ascii = options.get('ensure_ascii', True)
    max_lines = max([value.lines.count() for value in queryset])
    header = self.get_csv_header(columns, model_blade)
    header_line = self.get_csv_header(columns_lines, model_line)
    for i in range(max_lines):
        numbered_header_lines = ['%s %s' % (header, i + 1) for header in header_line]
        header.extend(numbered_header_lines)
    getters = self.getters_csv(columns, model_blade, ascii)
    getters_lines = self.getters_csv(columns_lines, model_line, ascii)
    def get_lines():
        yield header
        for blade in queryset.order_by('signage__code', 'number'):
            column_getter = [getters[field](blade, field) for field in columns]
            for obj in blade.lines.order_by('number'):
                column_getter.extend(getters_lines[field](obj, field) for field in columns_lines)
            yield column_getter
    writer = csv.writer(stream)
    writer.writerows(get_lines())