Как включить самую последнюю запись из обратного FK при экспорте из администратора django в файлы csv? - PullRequest
0 голосов
/ 11 мая 2018

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

class Person(models.Model):
    name = models.CharField(max_length=45)
    etc...

class Clothes(models.Model):
    person = models.ForeignKey(Person)
    etc...

У меня есть следующее в admin.py

class ExportCsvMixin:
    def export_as_csv(self, request, queryset):
        meta = self.model._meta
        field_names = [field.name for field in meta.fields]
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename={}.csv'.format(meta)
        writer = csv.writer(response)
        writer.writerow(field_names)
        for obj in queryset:
            row = writer.writerow([getattr(obj, field) for field in field_names])
        return response
    export_as_csv.short_description = "Export Selected as CSV"


class PersonAdmin(admin.ModelAdmin, ExportCsvMixin):
    actions = ["export_as_csv"]
    etc...

Это прекрасно работает, и я могу экспортировать CSV-файл со всеми полями из Person. Как мне добавить последнюю запись модели одежды в качестве поля для экспорта в csv?

1 Ответ

0 голосов
/ 11 мая 2018

Вы должны добавить вручную в свой field_names и список строк.

т.е.

    field_names = [field.name for field in meta.fields]
    field_names.append('recent_cloth')
    ...
    field_names.pop('recent_cloth')
    for obj in queryset:
        cloth = obj.cloth_set.first()
        row_list = [getattr(obj, field) for field in fields_names].append(cloth.name)
        row = writer.writerow([getattr(obj, field) for field in field_names])

Или, если вы создаете свой собственный набор запросов с select_related и annotate, выможно использовать поле ткани с объектом.

...