2015-02-17 106 views
0

我有一個的QueryDict對象在Django如下:迭代通過表單數據

{'ratingname': ['Beginner', 'Professional'], 'sportname': ['2', '3'] 

其中映射是這樣的:

2 Beginner 
3 Professional 

和2,3運動表的主鍵值在models.py

class Sport(models.Model): 
    name = models.CharField(unique=True, max_length=255) 

class SomeTable(models.Model): 
    sport = models.ForeignKey(Sport) 
    rating = models.CharField(max_length=255, null=True) 

我這裏有一個問題,我怎麼通過迭代,這樣我可以將其保存爲

st = SomeTable(sport=sportValue, rating=ratingValue) 
st.save() 

我曾嘗試以下:

ratings = dict['ratingname'] 
sports = dict['sportname'] 
for s,i in enumerate(sports): 
    sport = Sport.objects.get(pk=sports[int(s[1])]) 
    rate = SomeTable(sport=sport, rating=ratings[int(s)]) 
    rate.save() 

然而,這會在表格中輸入錯誤。例如,上面給出的數值是在我的表創建下列對象:

id: 1 
sport: 2 
rating: 'g' 

如何解決這個問題,或者是有更好的方法做一些事情?

回答

1

有幾個問題在這裏。主要的一點是QueryDict僅在返回['sportname']等時才返回最後一個值。爲了得到值的列表,請使用getlist('sportname'),如下記載: https://docs.djangoproject.com/en/1.7/ref/request-response/#django.http.QueryDict.getlist

enumerate是關閉的,太 - enumerate首先產生的指數,你的代碼分配給s。所以s[1]會拋出一個異常。有一種更好的方法可以在步驟中迭代兩個序列,但是 - zip

ratings = query_dict.getlist('ratingname') # don't reuse built in names like dict 
sports = query_dict.getlist('sportname') 
for rating, sport_pk in zip(ratings, sports): 
    sport = Sport.objects.get(pk=int(sport_pk)) 
    rate = SomeTable(sport=sport, rating=rating) 
    rate.save() 

你也可以考慮使用一個ModelForm根據您SomeTable模型。

+0

謝謝,彼得!這個解釋很有幫助。我不知道我哪裏錯了。 – Newtt 2015-02-17 23:43:53

1

您可以使用zip

ratings = dict['ratingname'] 
sports = dict['sportname'] 
for rating, sport_id in zip(ratings, sports): 
    sport = Sport.objects.get(pk=int(sport_id)) 
    rate = SomeTable(sport=sport, rating=rating) 
    rate.save()