2012-04-21 125 views
3

有沒有解決方法「實例需要有一個主鍵值之前,可以使用多對多關係」的錯誤?如何設置默認值爲manytomanyfield

我有一個模型有幾個字段,包括與另一個模型的多對多關係。當我創建模型的新實例時,我有一個函數可以在這些字段上設置默認值。處理HTTP GET時,我在視圖中執行此操作。 m2m字段使用formset呈現。

這裏描述的情況有些僞代碼:

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

有什麼建議?

我懷疑我可能需要在表單一側而不是模型一側處理這個問題,但這也讓我感到困惑。

+0

您需要保存模型與其他模型之前raleted它。像self.save() – danihp 2012-04-21 18:36:22

回答

2

對於什麼是1.3.1爲我工作的形式:

是類似於此,inital的許多東西

用硬編碼標識:

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)) 
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 
+0

我認爲問題是,'self'沒有'pk'價值直到'self'被保存。這意味着問題不是來自相關模式保存,而是在自我分配模型之前出現,然後取出一個pk。 – danihp 2012-04-21 18:34:05

+0

當然,你應該在調用'initialize'之前保存'model'對象 – San4ez 2012-04-21 18:40:02