首页 > 解决方案 > 如何将具有外键的 django 模型导出到 csv

问题描述

我有这个会话模型:

class session(models.Model):
    id = models.BigAutoField(primary_key=True)
    responden = models.ForeignKey(responden, on_delete=models.CASCADE)
    kognitifScore = models.IntegerField()
    sosioScore = models.IntegerField()
    fisikScore = models.IntegerField()
    totalScore = models.IntegerField()
    timeStart = models.DateTimeField(auto_now_add=False)
    timeEnd = models.DateTimeField(auto_now_add=False)
    duration = models.IntegerField()
    mark = models.ForeignKey(sessionMark, on_delete=models.CASCADE)
    order = models.ForeignKey(sessionOrder, on_delete=models.CASCADE)

现在我想将所有这些信息导出到 csv。我试试这个:

def exportsCSV(request):
    sessions = session.objects.all()
    response = HttpResponse('text/csv')
    response['Content-Disposition'] = 'attachment; filename=sessions.csv'
    writer = csv.writer(response)
    sess = sessions.values_list('id','kognitifScore','sosioScore','fisikScore','totalScore',
        'timeStart','timeEnd','duration','mark','order')
    for s in sess:
        print(s)
        writer.writerow(s)
    return response

这很好,但外国模特只返回他们的身份证。我如何将包括外国模型在内的所有这些导出到一行中?

标签: pythondjango-modelsforeign-keysexport-to-csv

解决方案


所以我只是回来发布我的解决方案。

def exportsCSV(request):
    sessions = session.objects.all()
    respondens = responden.objects.all()
    marks = sessionMark.objects.all()
    orders = sessionOrder.objects.all()
    response = HttpResponse('')
    response['Content-Disposition'] = 'attachment; filename=sessions.csv'
    writer = csv.writer(response,delimiter=';', quotechar='"', quoting=csv.QUOTE_MINIMAL)
    id = sessions.values_list('id')
    sess = sessions.values_list()
    resp = respondens.values_list()
    mark = marks.values_list()
    order = orders.values_list()
    ready = []
    for s in sess:
        for r in resp:
            if (r[0] == s[1]):
                ready.append(s[0])
                ready.extend(list(r[1:]))
                ready.extend(list(s[2:9]))
                break
        for m in mark:
            if (m[0] == s[9]):
                ready.extend(list(m[1:]))
                break
        for ord in order:
            if (ord[0] == s[10]):
                ready.extend(list(ord[1:]))
                break
        writer.writerow(ready)
        ready = []
    return response

我只是检查每个通讯员 ID,然后手动添加到数组中。我认为这种方法相当肮脏,也许有更多的pythonic方式来做到这一点


推荐阅读