Django REST framework. Как я могу сделать модель экспорта в CSV - PullRequest
0 голосов
/ 03 июля 2019

У меня есть следующие модели:

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

И урс:

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()),

]

Мне нужно сделать экспорт некоторых данных в CSV, в следующем формате:

  • ФИО студента
  • количество назначенных курсов студенту
  • количество пройденных курсов студентом

Например:

Test Student,10, 3
Test Student1,12, 1
Test Student2,5, 3
Test Student3,5, 4

Итак, какой у него должен быть взгляд. Я имею в виду, как я могу получить такие данные, как полное имя студента и т. Д. Я буду благодарен за помощь

1 Ответ

1 голос
/ 03 июля 2019

Вы можете использовать модуль Python csv* 1003. *.


Сначала я бы предложил определить full_name как свойство в вашей модели Student, так как оно будетпонятнее:

class Student(models.Model):
    ...

    @property
    def full_name(self):
        return self.first_name + ' ' + self.last_name

Затем вы можете определить простое 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

Это автоматически загрузит файл с именем export.csv с вашими желаемыми данными после того, какВы регистрируете его в своем urlconf и получаете доступ к нему через простой HTTP GET.

...