我在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'
我如何解决这个问题或者有更好的方法来做某事?
答案 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
。