Получение списка значений из набора запросов 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

Вернуться на верх