【问题标题】:DJANGO: How to Output CSV with model containing many-to-many field?DJANGO:如何使用包含多对多字段的模型输出 CSV?
【发布时间】:2012-05-14 09:45:48
【问题描述】:

我有一个“导出为 CSV”按钮,可以导出所有车型。当我将所有汽车导出为 CSV 时,“功能”(例如 AM/FM 收音机、月顶、皮革内饰、蓝牙、GPS 等)列显示如下:

[<Feature: GPS>, <Feature: Leather>]

我如何摆脱所有其他东西,只拥有“GPS,皮革”?

型号

class Features(models.Model):
    name = models.CharField(max_length=20)
    def __unicode__(self):
       return self.name

class Car(models.Model):
    model_name = models.CharField(max_length=20)
    features = models.ManyToManyField(features)
    def __unicode__(self):
       return self.model_name

VIEW.PY

def query(request):
    results = Car.objects.all()
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment;filename="car_export.csv"'
    writer = csv.writer(response)
    writer.writerow(['Model Name', 'Features'])
    for x in results:
        writer.writerow([x.model_name, x.role.all()])
        return response

回答:

型号:

class Features(models.Model):
    name = models.CharField(max_length=20)
    def __unicode__(self):
       return self.name

class Car(models.Model):
    model_name = models.CharField(max_length=20)
    features = models.ManyToManyField(features)
    def __unicode__(self):
       return self.model_name

观看次数:

def query(request):
    results = Car.objects.all()
    response = HttpResponse(mimetype='text/csv')
    response['Content-Disposition'] = 'attachment;filename="car_export.csv"'
    writer = csv.writer(response)
    writer.writerow(['Model Name', 'Features'])
    for x in results:
        writer.writerow([x.model_name, ', '.join([x.name for x in x.role.all()]),])
        return response

【问题讨论】:

  • 该调用返回一个QuerySet,这与您的results 查询集完全相同。您如何从&lt;Car: Nissan Xterra&gt; 获得model_name? x.model_name。同样的事情也适用于您的Features QuerySet
  • 抱歉,django/python 新手,我不完全理解您的评论..

标签: django csv many-to-many export export-to-csv


【解决方案1】:

取决于您要在 features 模型中打印的字段...您正在查看 m2m 管理器 - 它是返回查询集接口的帮助器。如果您想要所有相关功能,请致电x.features.all()

替换为您在特征模型上的实际字段。

csv_features = ','.join([x.MY_FIELD_HERE for x in x.features.all()])

【讨论】:

  • 我会将 csv_features = ','.join 等放在哪里?把它放在 x.features.all 的位置?
  • 我做了一些细微的改变(见问题的答案),但谢谢你的回答有效!
猜你喜欢
  • 2020-03-16
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 2019-04-20
  • 2010-10-30
  • 2020-08-13
相关资源
最近更新 更多