Django REST 框架。我如何在 csv 中导出模型

MrO*_*Sir 0 django django-models export-to-csv django-rest-framework

我有以下型号:

class Student(models.Model):
   first_name = models.CharField(verbose_name='student first name', max_length=64)
   last_name = models.CharField(verbose_name='student last name', max_length=64)
   email = models.EmailField()

class Meta:
    db_table = 'student'

def __str__(self):
    return self.first_name + ' ' + self.last_name

class Course(models.Model):
   name = models.CharField(max_length=255)
   description = models.TextField()
   start_date = models.DateField(null=True, blank=True, default=None)
   end_date = models.DateField(null=True, blank=True, default=None)

class Meta:
    db_table = 'course'

def __str__(self):
    return self.name

class CourseParticipant(models.Model):
    course = models.ForeignKey(Course, related_name='courses', on_delete=models.CASCADE)
    student = models.ForeignKey(Student, related_name='student_name', on_delete=models.CASCADE)
    completed = models.BooleanField(null=False, default=False)

    class Meta:
        db_table = 'course_participant'

    def __str__(self):
        return self.course, self.student
Run Code Online (Sandbox Code Playgroud)

还有我们:

urlpatterns = [
    path('course', CourseAPIView.as_view()),
    path('course/<int:pk>/', CourseAPIDetailView.as_view()),
    path('student', StudentAPIView.as_view()),
    path('student/<int:pk>/', StudentAPIDetailView.as_view()),
    path('student/assigned_to_course', StudentAssignedToTheCourseAPIView.as_view()),
    path('student/assign_student_to_course', StudentAssignToCourse.as_view()),
    path('student/assigned_to_course/<int:pk>/', StudentAssignedToTheCourseDetailView.as_view()),
    path('student/report/<int:pk>/', StudentReportView.as_view()),
Run Code Online (Sandbox Code Playgroud)

]

我需要以 csv 格式导出一些数据,格式如下:

  • 学生全名
  • 分配给学生的课程数量
  • 学生完成课程的数量

例如:

Test Student,10, 3
Test Student1,12, 1
Test Student2,5, 3
Test Student3,5, 4
Run Code Online (Sandbox Code Playgroud)

那么,应该采取什么观点呢?我的意思是,我如何获取学生全名等数据。我将不胜感激

wen*_*isa 8

您可以使用Python的csv模块。


首先,我建议full_name在模型中定义为属性,Student因为它会让它更清晰:

class Student(models.Model):
    ...

    @property
    def full_name(self):
        return self.first_name + ' ' + self.last_name
Run Code Online (Sandbox Code Playgroud)

APIView然后您可以为该作业定义一个简单的:

import csv

from django.http import HttpResponse

from rest_framework.views import APIView


class ExportCSVStudents(APIView):
    def get(self, request, *args, **kwargs):
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="export.csv"'

        writer = csv.writer(response)

        for student in Student.objects.all():
            assigned_courses = CourseParticipant.objects.filter(student=student)
            completed_courses = assigned_courses.filter(completed=True)

            row = ','.join([
                student.full_name,
                assigned_courses.count(),
                completed_courses.count()
            ])

            writer.writerow(row)

       return response
Run Code Online (Sandbox Code Playgroud)

export.csv在您在 urlconf 中注册并通过简单的 HTTP GET 访问它后,这应该会自动下载一个包含您所需数据的文件。