3

「多対多の関係を使用するには、インスタンスに主キーの値が必要です」というエラーを回避する方法はありますか?

別のモデルとの多対多の関係を含む、いくつかのフィールドを持つモデルがあります。モデルの新しいインスタンスを作成するときに、これらのフィールドにデフォルト値を設定する機能があります。HTTP GET を処理するときにビューでこれを行います。m2m フィールドは、フォームセットを使用してレンダリングされます。

状況を説明する擬似コードを次に示します。

class MyRelatedModel(models.Model):
  name = models.CharField(max_length=100,blank=True)

class MyModel(models.Model):
  name = models.CharField(max_length=100,blank=True)
  relatedModels = models.ManyToManyField("MyRelatedModel")

  def initialize(self):
    self.name = "my default name"
    # this bit doesn't really matter...
    # just assume I am creating a new set of RelatedModels that I want to associate with my this new MyModel...
    newRelatedModels = []
    for name in ["related model 1", "related model 2", "related model 3"]:
      relatedModel = MyRelatedModel(name=name)
      relatedModel.save()
      newRelatedModels.append(relatedModel.id)
    self.relatedModels = newRelatedModels # this is invalid!

def MyView(request):
  if request.method == 'GET':
    model = MyModel()
    model.initialize()
    form = MyForm(instance=model)
  return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request))

助言がありますか?

モデル側ではなくフォーム側でこれを処理する必要があるのではないかと思いますが、それも私を混乱させています。

4

2 に答える 2

2

フォームの場合、1.3.1で機能しているものは次のとおりです。

これに似たもので、最初の多対多

ハードコードIDの場合:

def MyView(request):
    if request.method == 'GET':
        model   = MyModel( name = "my default name")
        initial = { 'relatedModels': [1,] } # assuming you knew the id and wanted to hardcode it
        form = MyForm( instance=model, initial=initial )
        return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request))

クエリを使用して名前を入力します。

def MyView(request):
    if request.method == 'GET':
        model   = MyModel( name = "my default name")
        initial = { 'relatedModels':  [ o.pk for o in list(MyRelatedModel.objects.filter( name__in=("related model 1", "related model 2", "related model 3")))], } 
        form = MyForm( instance=model, initial=initial )
        return render_to_response("my_template.html", {"form" : form}, context_instance=RequestContext(request))
于 2012-04-27T17:43:32.577 に答える
1
for name in ["related model 1", "related model 2", "related model 3"]:
    relatedModel = MyRelatedModel(name=name)
    relatedModel.save()
    self.relatedModels.add(relatedModel)

または:

newRelatedModels = []
for name in ["related model 1", "related model 2", "related model 3"]:
    relatedModel = MyRelatedModel(name=name)
    relatedModel.save()
    newRelatedModels.append(relatedModel)
self.relatedModels.add(*newRelatedModels)

これも機能するはずです:

self.relatedModels = newRelatedModels
于 2012-04-21T18:20:34.060 に答える