How to export Django model data to a CSV file

I want to export all my model data to a CSV file:

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) 

What is the best way to do this ??

+4
source share
3 answers

I usually prefer the action for this in admin. This is 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" 

To use it in your view function

 def myview(request): data = download_csv(ModelAdmin, request, Model.objects.all()) return HttpResponse (data, content_type='text/csv') 
+17
source

One line changed. To avoid throwing AttributeError exceptions, you can add a default value of None if the attribute does not exist.

 writer.writerow([getattr(obj, field, None) for field in field_names]) 
0
source

Hi you can just do it

views.py

 def export_users_csv(request): response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="users.csv"' writer = csv.writer(response) writer.writerow(['employee','IG', 'follower', 'email', 'website', 'DA', 'youtube_url', 'youtube_name', 'subscriber', 'type','country']) users = Library.objects.all().values_list('employee','IG', 'follower', 'email', 'website', 'DA', 'youtube_url', 'youtube_name', 'subscriber', 'type','country') for user in users: writer.writerow(user) return response 

urls.py

 path('export', export_users_csv, name='export_users_csv'), 

page.html

 <a href="{% url 'export_users_csv' %}">Export all users</a> 
0
source

Source: https://habr.com/ru/post/1501174/


All Articles