2012-02-05 20 views
1

我讀過的一切,我可以找到關於在Django多對多的關係,但到目前爲止,我沒有看到任何東西ManyToMany-Through關係以及Django獨自處理的簡單ManyToMany。如何保存一個多對多的關係通過,解決了我有具體問題的Django模型,並定期多對多關係

考慮這些機型:

class Treatment(models.Model): 
    ... 
    book = models.ManyToManyField(Book, through='TreatmentLocation') 
    category = models.ManyToManyField(Category) 

class Book(models.Model): 
    name = models.CharField(...) 

class TreatmentLocation(models.Model): 
    treatment = models.ForeignKey(Treatment) 
    book = models.ForeignKey(Book) 
    page = models.CharField(...) 

class Category(models.Model): 
    name = models.CharField(...) 

我已經得到了數據即將在POST陣列上好聽,但finagling查看被證明是非常棘手。

def save_treatment(request): 
    form = TreatmentForm(request.POST) 

    if form.is_valid(): 
     treatment = form.save() 

     pages = request.POST.getlist('page') 
     books = request.POST.getlist('book') 

     counter = 0 
     for page in pages: 
      book_id = books.__getitem__(counter) 
      TreatmentLocation.objects.create(treatment_id=treatment.id, book_id=book_id, page=page) 
      counter = counter + 1 

     form.save_m2m() 
    else: 
     ... 

治療成功保存,因爲這樣做TreatmentLocations,但一旦我打電話save_m2m()來存儲處理類別外部參照,我得到的Cannot set values on a ManyToManyField which specifies an intermediary model. Use TreatmentLocation Manager錯誤。

有誰知道如何節省的這些東西?我想避免訴諸原始SQL。

+0

我相信我的文章我回答你的問題。這裏是:http://stackoverflow.com/questions/26608903/avoid-django-def-post-duplicating-on-save/26619058#26619058 – 2014-10-28 21:49:01

回答

1

爲什麼不從ModelForm中刪除throughManyToManyField

class MyForm(forms.ModelForm): 
    class Meta: 
     exclude = ('book',) 
     model = Treatment 
+2

所以,你必須刪除,並在模型保存第一M2M領域。您如何處理挽救'通過'M2M? – automagic 2013-03-07 16:53:19