3

この問題への多くのリンクを読みました:

manyToMany Through 関係と通常の manyToMany 関係を使用して django モデルを保存する方法

manyToMany Through 関係と通常の manyToMany 関係を使用して django モデルを保存する方法

ジャンゴ・マニトマニー

DOC を含めます: https://docs.djangoproject.com/en/dev/topics/db/models/#extra-fields-on-many-to-many-relationships

しかし、中間クラスを使用して M2M を保存することはできません。

私のモデル:

class Promotor(PessoaFisica):
    user = models.OneToOneField(User, blank=True, null=True)    


class Setor(models.Model):
    nome = models.CharField(max_length=255)
    promotores = models.ManyToManyField(Promotor, through='Membro', blank=True, null=True)     

    class Meta:
        verbose_name_plural = 'setores'

    def __unicode__(self):
        return "%s" % (self.nome)

class Membro(models.Model):
    promotor = models.ForeignKey(Promotor)
    setor = models.ForeignKey(Setor)
    data_inclusao = models.DateField(auto_now=True)  

保存方法:

def add_setor(request):
    form = SetorForm(request.POST or None)
    if form.is_valid():
        s = form.save()    
        setor = get_object_or_404(Setor, pk = s.id)    
        for promotor_id in request.POST.getlist('promotores'):
            membro = Membro.objects.create(promotor_id=promotor_id, setor_id=setor.id)          
            membro.save()         
        messages.add_message(request, messages.SUCCESS, 'Setor cadastrado com sucesso!')
        return HttpResponseRedirect('/project/setor/index/')
    return render_to_response('project/setor/form.html', locals(), context_instance=RequestContext(request))

エラーは次のとおりです。

Cannot set values on a ManyToManyField which specifies an intermediary model.  Use setor.Membro's Manager instead.

save() メソッドがコミット "false" を持っている場合、"setor" には Membro オブジェクトに入れる "id" がありません。中間クラスを介してこれで setor を保存する方法は? ありがとう!

4

2 に答える 2

4

中間クラスとの ManyToMany 関係を保存するためのソリューション (スルー):

def add_setor(request):
    form = SetorForm(request.POST or None)
    if form.is_valid():     
        setor = Setor.objects.create(nome=form.cleaned_data['nome'])
        for promotor_id in request.POST.getlist('promotores'):   
            m1 = Membro(promotor_id=promotor_id, setor=setor)
            m1.save()
        messages.add_message(request, messages.SUCCESS, 'Setor cadastrado com sucesso!')
        return HttpResponseRedirect('/project/setor/index/')
    return render_to_response('project/setor/form.html', locals(), context_instance=RequestContext(request))

フォームを直接使用していませんが、フォームの setor 名を抽出してから、オブジェクト setor を作成します。フォーム内の ID のプロモーターとオブジェクト setor を使用して Membro オブジェクトを作成します。最後のアクションは Membro オブジェクトの保存です。よろしく。

于 2012-04-20T15:47:45.103 に答える
4

promotoresフォームにモデルにリンクされたフィールドがあるため、save()m2m フィールドに保存しようとします。でフォームを保存しcommit=False、オブジェクトを手動で保存して (m2m には触れません)、m2m を今と同じように保存します。

form.cleaned_data['promotores']PS request.POST ではなく使用する必要があると思います。神は、クライアントから実際に投稿されたものを知っています。

于 2012-04-20T03:55:43.583 に答える