2013-09-08 2 views
4

Я хочу, чтобы экспортировать все данные моей модели в CSV-файл:Как экспортировать данные модели Django в CSV файл

models.py

import ast 
import uuid 
import base64 
from django.db import models 
from django.contrib import admin 
from qlu.settings import HOST_NAME,STATS_URI 
from django.core.validators import URLValidator 
#------------------------------------------------------------------------------ 


class short_url(models.Model): 
    """ 
     This is a short_url class 
    """ 
    blocked = models.BooleanField(default=False)        # To check whether URL is blocked or not 
    updated_at = models.DateTimeField(auto_now=True)       # When URL is updated 
    url = models.TextField(validators=[URLValidator()])       # URL entered by the user 
    created_at = models.DateTimeField(auto_now_add=True)      # When URL is created 
    url_hash = models.CharField(max_length=10,unique=True,db_index=True)  # base64 encoded URL id 

    def _generateShortUrl(self): 
     """ 
      This function will generate base64 encoded URL hash 
     """ 
     hash = base64.urlsafe_b64encode(uuid.uuid1().bytes)[:6] 
     hash_exist = short_url.objects.filter(url_hash=hash) 
     while hash_exist: 
      hash = base64.urlsafe_b64encode(uuid.uuid1().bytes)[:6] 
      hash_exist = short_url.objects.filter(url_hash=hash)   
      continue  
     return hash 


    def save(self, *args, **kwargs): 
     """ 
      Custom Save method for link model 
     """ 
     self.url_hash = self._generateShortUrl()   
     super(short_url, self).save(*args, **kwargs)  


    def get_short_url(self): 
     """ 
      This method returns the url_hash related to the url 
     """ 
     return HOST_NAME + self.url_hash 

    def get_stats_url(self): 
     """ 
      This method returns the stats page URL for a url_hash 
     """   
     return HOST_NAME + self.url_hash + STATS_URI 


    def __unicode__(self): 
     """ 
      This method convert Django model object to the user readable string 
     """ 
     return unicode(self.url) 


class click_info(models.Model): 
    """ 
     This is a click_info class 
    """ 
    user_ip = models.TextField()            # Store the user_ip 
    user_agent = models.TextField()            # Store the user_agent 
    http_refrer = models.TextField()           # Store the http_refrer 
    hash = models.ForeignKey(short_url)           # base64 encoded URL id 
    get_parameters = models.TextField()           # Store other get_parameters 
    request_time = models.DateTimeField()          # When user made the request_time 
    updated_at = models.DateTimeField(auto_now=True)       # When click_info is updated 
    created_at = models.DateTimeField(auto_now_add=True)      # When click is created 


    def get_parameters_dict(self): 
     """ 
      This method returns the get parameter dict 
     """ 
     return ast.literal_eval(self.get_parameters) 


    def __unicode__(self): 
     """ 
      This method convert Django model object to the user readable string 
     """ 
     return unicode(self.hash) 


#------------------------------------------------------------------------------ 

class short_url_admin(admin.ModelAdmin): 
    """ 
     short_url_admin class 
    """ 
    list_display = ('url','blocked','updated_at', 
        'created_at','url_hash') 
    exclude = ('url_hash',) 


class url_info_admin(admin.ModelAdmin): 
    """ 
     url_info_admin class 
    """ 
    list_display = ('user_ip','user_agent','http_refrer', 
        'hash','request_time','get_parameters_dict')  

#------------------------------------------------------------------------------ 
admin.site.register(short_url,short_url_admin) 
admin.site.register(click_info,url_info_admin) 

Что такое лучший способ сделать это ..?

+0

Возможно, вы должны прочитать https://docs.djangoproject.com/en/dev/howto/outputting-csv/. Объедините это с .objects.all(), и я думаю, что у вас есть решение. – zero323

+0

Я создал представление на основе класса, чтобы помочь в организации представлений CSV в python https://github.com/dm03514/django-cbv-toolkit – dm03514

+0

https://github.com/azavea/django-queryset-csv –

ответ

15

Обычно я предпочитаю действие для этого в админ. Это snippet:

def download_csv(modeladmin, request, queryset): 
    if not request.user.is_staff: 
     raise PermissionDenied 
    opts = queryset.model._meta 
    model = queryset.model 
    response = HttpResponse(mimetype='text/csv') 
    # force download. 
    response['Content-Disposition'] = 'attachment;filename=export.csv' 
    # the csv writer 
    writer = csv.writer(response) 
    field_names = [field.name for field in opts.fields] 
    # Write a first row with header information 
    writer.writerow(field_names) 
    # Write data rows 
    for obj in queryset: 
     writer.writerow([getattr(obj, field) for field in field_names]) 
    return response 
download_csv.short_description = "Download selected as csv" 

Чтобы использовать его в функции просмотра

def myview(request): 
    data = download_csv(ModelAdmin, request, Model.objects.all()) 

    return HttpResponse (data, content_type='text/csv') 
+0

Это не сработало для меня. Может ли python3 быть причиной? Ошибка: «View app.views.bulk_download не возвратил объект HttpResponse. Вместо этого вместо него он вернул Нет. – iankit

0

подредактированны одна линия. Чтобы избежать возврата исключений AttributeError, вы можете добавить значение по умолчанию None, если атрибут не существует.

writer.writerow([getattr(obj, field, None) for field in field_names]) 
Смежные вопросы