Django中将CSV导入到多对多字段

0 投票
1 回答
1143 浏览
提问于 2025-04-18 13:52

我用下面的代码把一个csv文件导入到Django模型中,这个模型里有一个多对多的字段叫做Release.metamodules。

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

因为这个字段是多对多的,所以我用了objects.filter来获取多个记录。但是它返回了错误。请帮我解决这个问题。

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 个回答

1

你不能这样创建你的 Release 对象。你不能从未保存的对象中创建多对多关系。可以查看这里

试试下面这样的做法:

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)

可能有更好的方法来写这个循环,但这就是你想要达到的效果。

撰写回答