python 如何将Django模型数据导出到CSV文件

moiiocjp  于 2022-12-21  发布在  Python
关注(0)|答案(5)|浏览(167)

我想将所有模型数据导出到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)

做这件事的最好方法是什么?

htzpubme

htzpubme1#

我通常更喜欢在管理中执行此操作。这是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')
guykilcj

guykilcj2#

以下是@symbiotech对Python 3的回答的更新版本。

实用程序.py

def download_csv(request, queryset):
  if not request.user.is_staff:
    raise PermissionDenied

  model = queryset.model
  model_fields = model._meta.fields + model._meta.many_to_many
  field_names = [field.name for field in model_fields]

  response = HttpResponse(content_type='text/csv')
  response['Content-Disposition'] = 'attachment; filename="export.csv"'

  # the csv writer
  writer = csv.writer(response, delimiter=";")
  # Write a first row with header information
  writer.writerow(field_names)
  # Write data rows
  for row in queryset:
      values = []
      for field in field_names:
          value = getattr(row, field)
          if callable(value):
              try:
                  value = value() or ''
              except:
                  value = 'Error retrieving value'
          if value is None:
              value = ''
          values.append(value)
      writer.writerow(values)
  return response

查看次数.py

def export_csv(request):
  # Create the HttpResponse object with the appropriate CSV header.
  data = download_csv(request, Publication.objects.all())
  response = HttpResponse(data, content_type='text/csv')
  return response
lymgl2op

lymgl2op3#

嗨你可以简单地做

    • 查看次数. py**
from django.http import HttpResponse
import csv

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
    • 网址. py**
from .views import export_users_csv

path('export', export_users_csv, name='export_users_csv'),
    • 页面. html**
<a href="{% url 'export_users_csv' %}">Export all users</a>
plupiseo

plupiseo4#

调整了一行。为了避免返回AttributeError异常,如果属性不存在,可以添加默认值None。

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

k2arahey5#

另一个快速简单的方法是使用Pandas图书馆。

import pandas as pd

...

def export_csv(request):
  df = pd.DataFrame(o.__dict__ for o in MyModel.objects.all())
  df.to_csv("/my/path/my_filename.csv")
  return HttpResponse("<p>Done!</p>")

相关问题