Получение списка значений из набора запросов ManytoMany
У меня есть две модели Bookings и Presenter, которые настроены как поле Many to Many Field.
Затем у меня есть функция под названием 'export excel' (найдена в онлайн-учебнике), которая экспортирует все данные из модели Booking в таблицу Excel. Каждое бронирование может содержать более одного ведущего.
В настоящее время экспорт работает, но отображает новую запись для бронирований, в которых назначено более одного ведущего. Можно ли сделать так, чтобы имя ведущего отображалось в виде списка, а не дублировалось в новой строке.
Например, если бронирование 1 содержит двух ведущих, имена будут отображаться как ['mark', 'jake']
Количество, используемое в функции экспорта excel
rows= Bookings.objects.all().exclude(status='Cancelled').values_list(
'id', 'program_type', 'delivery_method', 'booking_date', 'booking_time', 'duration', 'school_name', 'year_level', 'street', 'suburb', 'post_code',
'contact_name', 'email', 'phone_number', 'comments', 'students_attending', 'status', 'presenter__name')
Модели
class Presenter(models.Model):
id = models.BigAutoField(primary_key=True)
name = models.CharField(max_length=80)
email = models.EmailField()
phone_number = models.CharField(max_length=10)
role = models.CharField(max_length=50)
def __str__(self):
return self.name
class Bookings(models.Model):
statuses = [
('TBC', 'TBC'),
('Confirmed', 'Confirmed'),
('Completed', 'Completed'),
('Cancelled', 'Cancelled'),
]
id = models.BigAutoField(primary_key=True)
program_type = models.CharField(max_length=40)
delivery_method = models.CharField(max_length=40)
booking_date = models.DateField()
booking_time = models.CharField(max_length=10)
duration = models.CharField(max_length=10)
school_name = models.CharField(max_length=120)
year_level = models.CharField(max_length=10)
street = models.CharField(max_length=120)
suburb = models.CharField(max_length=120)
post_code = models.CharField(max_length=10)
contact_name = models.CharField(max_length=80)
email = models.EmailField()
phone_number = models.CharField(max_length=10)
comments = models.TextField(blank=True, null=True)
students_attending = models.CharField(max_length=5)
status = models.CharField(max_length=80, choices=statuses, default='TBC')
presenter = models.ManyToManyField(Presenter)
def __str__(self):
return self.contact_name
Функция
def export_excel(request):
# Set the application type
response = HttpResponse(content_type='application/ms-excel')
# Set the file name and extenstion
response['Content-Disposition'] = 'attachment; filename=Advancement Series' +'.xls'
# Create the workbook
wb = xlwt.Workbook(encoding='utf=8')
# Add the worksheets
advancement = wb.add_sheet('Advancement')
# Set the starting row number
advancement_row_num = 0
# Set the font style
font_style = xlwt.XFStyle()
font_style.font.bold = True
font_style.font.name = 'calibri'
# Set the worksheet columns
advancement_columns = ['Booking ID', 'Program Type', 'Delivery Method', 'Booking Date', 'Booking Time', 'Duration', 'School Name', 'Year Level', 'Street', 'Suburb','Post Code', 'Contact Name', 'Email', 'Phone Number', 'Comments', ' Students Attending', 'Status', 'Presenter']
for col_num in range(len(advancement_columns)):
advancement.write(advancement_row_num, col_num, advancement_columns[col_num], font_style)
# Set the font style for non headings
font_style = xlwt.XFStyle()
font_style.font.name = 'calibri'
# Adds the values from the Bookings table
rows= Bookings.objects.all().exclude(status='Cancelled').values_list(
'id', 'program_type', 'delivery_method', 'booking_date', 'booking_time', 'duration', 'school_name', 'year_level', 'street', 'suburb', 'post_code',
'contact_name', 'email', 'phone_number', 'comments', 'students_attending', 'status', 'presenter__name')
for row in rows:
advancement_row_num+=1
for col_num in range(len(row)):
advancement.write(advancement_row_num, col_num, str(row[col_num]), font_style)
wb.save(response)
return response
Удалось решить эту проблему с помощью Django import-export.
https://django-import-export.readthedocs.io/en/latest/getting_started.html