迭代表单数据

时间:2015-02-17 23:13:02

标签: python django

我在Django中有一个QueryDict对象,如下所示:

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

我的问题是,如何遍历ratingname以便我可以将其保存为

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'

我如何解决这个问题或者有更好的方法来做某事?

2 个答案:

答案 0 :(得分: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()

答案 1 :(得分: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