csv导入到manytomanyfield Django

时间:2014-07-18 17:54:38

标签: python django csv

我使用下面的代码将csv文件导入包含manytomanyfield Release.metamodules的django模型

>>> from app.models import Metamodule,Release
>>> reldata = csv.reader(open('/root/Django-1.6.5/django/bin/dashboard/release.csv'),delimiter=',')

for row in reldata:
  q = Release(number = row[0],
      notes= row[1],
      changes = row[2],
      metamodules = Metamodule.objects.filter(name = row[3]))

  try:
      q.save()
  except:
     # if the're a problem anywhere, you wanna know about it
     print "there was a problem with line"

错误:

Traceback (most recent call last):
 File "<console>", line 5, in <module>
 File "/usr/local/lib/python2.7/site-packages/django/db/models/base.py", line 416, in    __init__
    raise TypeError("'%s' is an invalid keyword argument for this function" %   list(kwargs)[0])
TypeError: 'metamodules' is an invalid keyword argument for this function

由于该字段是ManyToManyField,我使用objects.fileter来获取多个记录。但它返回错误。请帮我解决这个问题

models.py:

class Metamodule(models.Model):
    name = models.CharField(max_length=50)
    version = models.IntegerField(default=0)
    modulename = models.ForeignKey(Module)
    createdate = models.DateField(auto_now=True, null=True)
    createdby = models.CharField(max_length=50)

    def __unicode__(self): 
        return unicode(self.name)


class Release(models.Model):
    number = models.IntegerField(default=0)
    notes = models.CharField(max_length=50)
    changes = models.CharField(max_length=50)
    metamodules = models.ManyToManyField(Metamodule)

    def __unicode__(self): 
        return unicode(self.number)

1 个答案:

答案 0 :(得分:0)

您无法像这样创建Release对象。您无法从未保存的对象创建m2m关系。 See here

尝试这样的事情:

for row in reldata:
    q = Release(number=row[0], notes=row[1], changes=row[2])
    # You have to save the object before adding the m2m relations
    q.save()

    metamodules = Metamodule.objects.filter(name=row[3])    
    for metamodule in metamodules:
        q.metamodules.add(metamodule)

可能有更好的方法来执行for循环,但这是你想要实现的目标。