2009-08-15 57 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))