2012-05-04 23 views
1

我有一个“导出到CSV”按钮,导出所有车型。当我所有的汽车出口到CSV时,“特征”(如AM/FM收音机,天窗,真皮内饰,蓝牙,GPS等)列会显示如下所示:DJANGO:如何使用包含多对多字段的模型输出CSV?

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

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

MODEL

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 
+0

这个调用返回一个'QuerySet',这是因为你的'results'查询集..你怎么''从<汽车:日产XTERRA> model_name'完全一样'? x.model_name。同样的事情适用于你的'特点QuerySet' –

+0

对不起,新的Django/Python和我不完全理解你的评论.. – thedeepfield

回答

2

取决于你想要在features模型打印什么领域...你正在寻找一个M2M经理 - 这是一个返回查询集接口的辅助工具。如果你希望所有相关的功能,你会想打电话x.features.all()

与特征模型的实际现场更换。

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

会在哪里我把csv_features =“”。加入等等等等?把它放在x.features.all的地方? – thedeepfield

+0

编辑该问题以更好地反映我的问题。 – thedeepfield

+0

我做了一些细微的变化(请参阅问题的答案),但谢谢你的答案工作! – thedeepfield

相关问题