2013-02-22 37 views
6

Tôi khá mới với django và Python và muốn có thể xuất danh sách các mục trong các sản phẩm mẫu của tôi. Tôi đang xem tài liệu tại đây - https://docs.djangoproject.com/en/dev/howto/outputting-csv/Xuất các mục từ mô hình sang CSV Django/Python

Tôi cho rằng tôi cần tạo một biến lưu trữ tất cả dữ liệu mà tôi muốn. Nhưng không chắc nó sẽ ở đâu trong đoạn mã trên liên kết ở trên.

Xin lỗi vì đây là một câu hỏi rất ngớ ngẩn nhưng thực sự sẽ giúp ích gì cả.

Đây là đoạn mã để kịch bản của tôi cho đến nay:

import csv 

from products.models import Product 

from django.http import HttpResponse 


def export_to_csv(request): 
    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="mytest.csv"' 

Trả lời

10

Có một cái nhìn tại python csv module.

Bạn có lẽ sẽ muốn nhận được các mô hình cánh đồng với

def get_model_fields(model): 
    return model._meta.fields 

Sau đó sử dụng

getattr(instance, field.name) 

để có được những giá trị trường (như trong this câu hỏi).

Sau đó, bạn sẽ muốn một cái gì đó giống như

with open('your.csv', 'wb') as csvfile: 
    writer = csv.writer(csvfile) 
    # write your header first 
    for obj in YourModel.objects.all(): 
     row = "" 
     for field in fields: 
      row += getattr(obj, field.name) + "," 
     writer.writerow(row) 

Đó là một tiết chút (và chưa được kiểm tra), nhưng nó sẽ cho bạn một ý tưởng. (Oh và đừng quên đóng tập tin của bạn)

+0

Đã tìm thấy bạn có thể sử dụng "cho lĩnh vực trong obj._meta.get_all_field_names():". Có thể hơi ngắn gọn hơn một chút. –

2

Bạn cũng có thể tạo mẫu để hỗ trợ định dạng!

Mẫu là một Django mẫu chung

from django.template import loader 
def export_to_csv(request): 
    response = HttpResponse(mimetype='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="products-list.csv"' 
    template = loader.get_template('templates/products_template.csb') 
    response.write(template.render(Context({'products': Products.objects.all()}))) 
    return response 
12

Tùy thuộc vào kịch bản - bạn có thể muốn có một CSV của mô hình của bạn. Nếu bạn có quyền truy cập vào các trang web Django Quản trị, bạn có thể cắm vào một hành động chung cho bất kỳ mô hình hiển thị như một danh sách (google: django hành động quản trị)

http://djangosnippets.org/snippets/790/

Nếu bạn đang hoạt động với một giao diện điều khiển (python manage.py ...), bạn có thể sử dụng như một kịch bản, mà tôi chỉ được sử dụng:

(đặt nó vào: yourapp/quản lý/lệnh/model2csv.py)

""" 
Prints CSV of all fields of a model. 
""" 

from django.core.management.base import BaseCommand, CommandError 
import csv 
import sys 

class Command(BaseCommand): 
    help = ("Output the specified model as CSV") 
    args = '[appname.ModelName]' 

    def handle(self, *app_labels, **options): 
     from django.db.models import get_model 
     app_name, model_name = app_labels[0].split('.') 
     model = get_model(app_name, model_name) 
     field_names = [f.name for f in model._meta.fields] 
     writer = csv.writer(sys.stdout, quoting=csv.QUOTE_ALL) 
     writer.writerow(field_names) 
     for instance in model.objects.all(): 
      writer.writerow([unicode(getattr(instance, f)).encode('utf-8') for f in field_names]) 

này không bắt bất kỳ trường hợp ngoại lệ vv, nhưng với tư cách là Quản trị viên, bạn sẽ không gây ra chúng được nâng lên, phải không?

sử dụng nó như:

./manage.py model2csv my_ecommerce.Product > products.csv 
+0

Dường như nó không hoạt động nếu một trong các thuộc tính là khóa ngoại. Đối với các thuộc tính như vậy, tôi nhận được các giá trị của biểu mẫu 'id unknown', trong đó' id' là giá trị của khóa ngoại (ví dụ: '1 unknown'). Điều gì làm việc cho tôi là 'field_names = [f.attname cho f trong model._meta.fields]'. – silentser

+0

Tôi khuyên bạn nên sử dụng select_related trên queryset. Nếu bạn có khóa ngoài, bạn sẽ có rất nhiều truy vấn SQL. 'ví dụ trong model.objects.all().select_related(): writer.writerow ([unicode (getattr (instance, f)). encode ('utf-8') cho f trong field_names]) ' – maykel

Các vấn đề liên quan