Django: Почему этот запрос получает номера pk вместо имен при загрузке excel?

Здесь начинающий django: У меня есть следующий код для загрузки документа excel с моей домашней страницы:

class ExcelDownloadAllView(TemplateView):
    def get(self, request, *args, **kwargs):
        columns = ['Project Number', 'Assignee', 'Priority', 'Status', 'title','Summary', 'created_by']
        rows = BugTracker.objects.all().values_list('project_number','assignee','priority','status', 'title', 'summary', 'author', )
        filename ='All_Projects.xls'
        return create_sheet_response(filename, columns, rows)

def create_sheet_response(filename, columns, rows):
    response = HttpResponse(content_type='application/ms-excel')
    response['Content-Disposition'] = f'attachment; filename={filename}'

    wb = xlwt.Workbook(encoding='utf-8')
    ws = wb.add_sheet('All Projects Data') # this will make a sheet named Projects Data

# Sheet header, first row
row_num = 0

font_style = xlwt.XFStyle()
font_style.font.bold = True

for col_num in range(len(columns)):
    ws.write(row_num, col_num, columns[col_num], font_style) # at 0 row 0 column 

# Sheet body, remaining rows
font_style = xlwt.XFStyle()
for row in rows:
    row_num += 1
    for col_num in range(len(row)):
        ws.write(row_num, col_num, row[col_num], font_style)

wb.save(response)

return response

#models
class Developer(models.Model):
    firstname = models.CharField(max_length=30, default="To be")
    lastname = models.CharField(max_length=30, default="Assigned")
    email = models.EmailField(blank=True)

    def __str__(self):
        return self.firstname + " " + self.lastname

    def get_absolute_url(self):
        return reverse("developer_list")


class BugTracker(models.Model):
    project_number= models.IntegerField(primary_key=True)
    assignee=  models.ForeignKey(Developer, on_delete=models.CASCADE, null=True)
    priority = models.CharField(max_length=10, choices=priority_choices)
    title = models.CharField(max_length=70)
    summary=models.TextField()
    status= models.CharField(max_length=20, choices=progress, default="Open")
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, null=True)
    created_at=models.DateTimeField(default=timezone.now)
    updated_at=models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.summary

    def get_absolute_url(self): 
        return reverse("bug_list")

Успешно создается файл excel, но он загружает внешние ключи из моих моделей, используя номер pk/id вместо имени, связанного с этим номером pk. Поэтому в данном примере поля "assignee" и "author" показывают номера pk, связанные с моделями, которые у меня есть. Как я могу это исправить?

Также, есть ли способ загрузить "DateTime Fields? Каждый раз, когда я пытаюсь добавить поле "created_at/updated_at", оно выдает ошибку "Cannot resolve keyword 'created at' into field. Choices are..." Спасибо! Помощь в любом вопросе будет принята с благодарностью.

Вместо author можно использовать author__FIELDNAME например author__first_name или author__email

Для полей datetime мне нужно больше деталей, вообще, для таких вещей лучше использовать правильную сериализацию с помощью сериализаторов marshmallow, pydantic или Drf, чтобы вы могли настроить желаемый вывод. Затем вы передаете набор запросов сериализатору и получаете обратно сериализованные данные в виде списка dicts.

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