2009-08-15 31 views
1

首先发布到stackoverflow我做了一个搜索,干起来了。我也自己 django书(Forcier,Bissex,淳),他们不解释如何做 这。总之我无法弄清楚如何progmatically通过 一个python shell脚本到ManyToMay模型添加数据..models.py与ManyToMany和通过shell脚本逐步添加数据

from django.db import models 
from django.contrib import admin 

class Client(models.Model): 
    client  = models.CharField(max_length=256, primary_key=True) 
    access  = models.DateField() 
    description = models.TextField() 
    host   = models.CharField(max_length=256) 
    lineEnd  = models.CharField(max_length=256) 
    options  = models.TextField() 
    owner   = models.CharField(max_length=100) 
    root   = models.CharField(max_length=256) 
    submitOptions = models.CharField(max_length=256) 
    update  = models.DateField() 
    def __unicode__(self): 
    return str(self.client) 
admin.site.register(Client) 


class Change(models.Model): 
    """This simply expands out 'p4 describe' """ 
    change  = models.IntegerField(primary_key=True) 
    client  = models.ManyToManyField(Client) 
    desc   = models.TextField() 
    status  = models.CharField(max_length=128) 
    def __unicode__(self): 
    return str(self.change) 
admin.site.register(Change) 

这里是我有工作,但我不知道如何添加许多许多公司。我似乎无法弄清楚如何进行调用它。 我知道SQL中的行存在。

--- massImport.py ---

# Assume the client "clientspec" exists. I know how to create that if 
neeeded. 
changes = [ { 'change': 123, 'desc': "foobar", status': "foobar", 
client': "clientspec", }] 
for item in changes: 
    entry = Change( 
      change = item['change'], 
      desc = item['desc'], 
      status = item['status'], 
      # client = Client.objects.filter(client=item['client']) 
      ) 
    entry.save() 

谁能告诉我在哪里我的方式错误是。我真的很喜欢 。 谢谢!

回答

0

.filter返回一个列表,当你需要的是一个单一的对象,所以你应该使用.get(client=item['client'])

+0

都能跟得上! 类型错误:“客户端”是此功能 无赖无效关键字参数 - 我想你了吧.. – rh0dium 2009-08-15 02:32:48

2

原来蒂亚戈是非常接近..

# Assume the client "clientspec" exists. I know how to create that if 
neeeded. 
changes = [ { 'change': 123, 'desc': "foobar", status': "foobar", 
client': "clientspec", }] 
for item in changes: 
    entry = Change() 
    entry.change = item['change'] 
    entry.desc = item['desc'] 
    entry.status = item['status'] 
    entry.time = datetime.datetime.fromtimestamp(float(item['time'])) 
    entry.client.add(Client.objects.get(client=item['client'])) 
    entry.save() 

所以..我会给道具蒂亚戈

+0

+1'更改= [{“改变”:123,“说明”:“foobar的”状态':“foobar”, client':“clientspec”,}]''我通常使用'changes =((123,'foobar','foobar','clientspec'),...)'看起来非常糟糕。 – suhailvs 2013-07-06 05:17:57

0

我试过的代码,但我得到的错误

ValueError: "<Change: 123 -- foobar>" needs to have a value for field "change" before this many-to-many relationship can be used

多对多(entry.client.add)只能保存后场被用来即entry.save()

可能有很多客户,所以你可以使用:

changes = [{'change': 123, 'desc': "foobar", 'status': "foobar", 
'client': ("client1","client2"),},{......] 
for item in changes: 
    entry = Change( 
     change = item['change'], 
     desc = item['desc'], 
     status = item['status'],) 
    entry.save() 
    for c in item['client']: 
     entry.client.add(Client.objects.get(client=c))