2012-02-25 10 views
1

私のモデルGroupMembersにインポートする単純なCSVインポートフォームを作成しようとしています。 GroupMembersモデルには、My Groupsモデルにリンクする多対多フィールドがあります。特定のグループのCSVメンバーシップファイルをアップロードすることができます。 CSVアップロードと同じページのドロップダウンからグループを選択します。メンバーは複数のグループのメンバーになることができます。メンバーがすでに存在する場合は、新しいグループ関係を追加するだけです。多対多のフィールドを持つモデルにCSVをインポート

私のコードは部分的に動いています - それはグループメンバーを追加しますが、私はグループへの多対多のリンクに問題があります。ここに私のコードは、これまでのところです

(グループ)

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

models.py - 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() 

views30(部分)

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」が存在しないというエラーが表示されています。これは、新しいグループレコードを作成しようとしていることを意味します。私は単純に選択から選択された既存のグループを使用し、それをグループの多対多フィールドに追加するだけです。返信用

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

答えて

1

を高く評価しました。これで、多対多の関係が追加されましたが、管理画面で2が同じであっても、selectから取り出すのではなく、グループを読み込んでいます。名前は現在一意であるため、複数のグループのメンバーである可能性があるため、実際のグループメンバーに対してget_or_createを使用する必要がありますか?
+0

おかげで、私は進歩している:それはまだ存在しない場合にのみ意味があります

希望は、任意のヘルプは、オブジェクトを作成し使用get_or_create

関連する問題