2012-02-25 22 views
1

我試圖創建一個簡單的CSV導入窗體,導入到我的模型GroupMembers。 GroupMembers模型具有鏈接到我的Groups模型的多對多字段。這個想法是可以上傳特定組的CSV會員文件;您可以從CSV上傳的同一頁面的下拉菜單中選擇一個組。成員可以是多個組的成員,所以如果成員已經存在,它應該只添加新的組關係。CSV導入到模型與多對多字段

我的代碼部分工作 - 它增加了groupmembers - 但我遇到了與羣組的多對多鏈接問題。這是到目前爲止我的代碼

models.py(集團)

class Group (models.Model): 
    initials = models.CharField(max_length = 20) 
    initials_lower = models.CharField(max_length = 20) 
    full_name = models.CharField('Full name', max_length = 100) 

models.py(groupmember) - 這是那裏的CSV增加

from django.db import models 
from datetime import datetime 

class GroupMember (models.Model): 
    name = models.CharField('Name', max_length = 30, unique = True) 
    pub_date = models.DateTimeField('Date published', auto_now_add = True) 
    groups = models.ManyToManyField('groups.Group', blank = True) 

    def __unicode__(self): 
     return self.name 

forms.py

from django import forms 
import csv 
from myproject.groupmembers.models import GroupMember 
from myproject.groups.models import Group 


class GroupImportForm (forms.Form): 

    csv_file = forms.FileField() 
    group_name = forms.ModelChoiceField(queryset=Group.objects.all()) 

    def save(self): 
     records = csv.reader(self.cleaned_data["csv_file"]) 
     for line in records: 
      input_data = GroupMember() 
      input_data.handle = line[0] 
      input_data.groups.create(initials=self.cleaned_data["group_name"]) <-- this is where the problem is 
      input_data.save() 

views.py(部分)

def batch_add (request): 
    if request.method == 'POST': 
     form = GroupImportForm(request.POST, request.FILES) 
    if form.is_valid(): 
     form.save() 
    else: 
     form = GroupImportForm() 

    return render_to_response(
     'members/batch_add.html', 
     { 
     'form': form, 
     }, 
    context_instance=RequestContext(request) 
    ) 

上傳時出現的錯誤是'initials_lower'不存在,這意味着它試圖創建一個新的組記錄,我不希望它做。我只是希望它使用從select中選擇的預先存在的組,並將其添加到組中的多對多字段中。

希望是有道理的,任何幫助讚賞

回答

1

使用get_or_create它創建一個對象只有當不存在吧:

input_data.groups.get_or_create(initials=self.cleaned_data["group_name"]) 
+0

感謝您的答覆,我在進步。它現在添加了多對多的關係,但是它正在讀取該組,而不是從選擇中獲取,即使管理屏幕中的2是相同的。由於名稱目前是唯一的,我應該使用get_or_create作爲實際的組成員,因爲它們可能是多個組的成員? – 2012-02-25 18:55:40