我想在django项目中将dict转换为QueryDict.链接夫妇存在来解释这个(Django的:我可以从字典中创建的QueryDict?并且如何改变一个Django的QueryDict到Python字典?).这是我要翻译的简单字典abc = {'a': 1, 'b':[1,2,3]}.我试过这种方法:
from django.http import QueryDict
from django.utils.datastructures import MultiValueDict
abc = { 'a': 1, 'b':[1,2,3]}
mdict = MultiValueDict(abc)
qdict = QueryDict(mdict)
Run Code Online (Sandbox Code Playgroud)
这是我得到的错误跟踪
/usr/lib/python2.7/urlparse.pyc in parse_qsl(qs, keep_blank_values, strict_parsing)
407 Returns a list, as G-d intended.
408 """
409 pairs = [s2 for s1 in qs.split('&') for s2 in s1.split(';')]
410 r = []
411 for name_value in pairs:
AttributeError: 'MultiValueDict' object has no attribute 'split'
Run Code Online (Sandbox Code Playgroud)
为什么会失败,我该如何完成?MultiValueDict和QueryDict之间有什么区别?
我想将ModelForm数据存储在中的数据库中JSONField,以便以后可以根据此数据创建对象,只需调用:
form = ModelForm(data_from_jsonfield_as_querydict)
if form.is_valid():
object = form.save()
Run Code Online (Sandbox Code Playgroud)
问题一:
我在POST中有数据:
>>> print request.POST
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}
Run Code Online (Sandbox Code Playgroud)
而且我必须将其转换QueryDict为dict。但是,如果我打电话给request.POST.dict()我,我会失去字段2的列表值:
>>> print request.POST.dict()
{'field-1': 'value1', 'field-2': 'value-2b'}
Run Code Online (Sandbox Code Playgroud)
我尝试使用,request.POST.getlist但随后获得所有值作为列表:
>>> for k in request.POST.keys():
... print request.POST.getlist(k)
[u'value1']
[u'value-2a', u'value-2b']
Run Code Online (Sandbox Code Playgroud)
我什至无法检查上述循环中的给定值是否为列表实例,因为request.POST.get(k)如果值是list且另一方面针对每个字段request.POST[k]返回MultiValueDictKeyError,则不返回错误。
我想到的唯一解决方案是循环遍历所有获得的字段getlist()并将一值列表转换为字符串,但是在我看来,这似乎有点过分。
问题2:
假设问题1已解决,并且我已经dict将表单数据存储在数据库中,如下所示:
# object.data
{u'field-1': u'value1', u'field-2': [u'value-2a', u'value-2b']}
Run Code Online (Sandbox Code Playgroud)
当我想使用上述内容dict作为表单数据创建对象时,我必须将其转换为do QueryDict,这可以通过以下方式简单地完成:
querydict = QueryDict('', …Run Code Online (Sandbox Code Playgroud) 我有一个带有外键帐户的分支模型(分支的所有者):
class Branch(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
name = models.CharField(max_length=100)
account = models.ForeignKey(Account, null=True, on_delete=models.CASCADE)
location = models.TextField()
phone = models.CharField(max_length=20, blank=True,
null=True, default=None)
create_at = models.DateTimeField(auto_now_add=True, null=True)
update_at = models.DateTimeField(auto_now=True, null=True)
def __str__(self):
return self.name
class Meta:
unique_together = (('name','account'),)
...
Run Code Online (Sandbox Code Playgroud)
我有一个带有用户外键的帐户模型(一对一字段):
class Account(models.Model):
_safedelete_policy = SOFT_DELETE_CASCADE
name = models.CharField(max_length=100)
user = models.OneToOneField(User)
create_at = models.DateTimeField(auto_now_add=True)
update_at = models.DateTimeField(auto_now=True)
def __str__(self):
return self.name + ' - ' + self.create_at.strftime('%Y-%m-%d %H:%M:%S')
Run Code Online (Sandbox Code Playgroud)
我为分支创建了ModelViewSet,它显示了登录用户拥有的分支:
class BranchViewSet(viewsets.ModelViewSet):
serializer_class = BranchSerializer
permission_classes = (permissions.IsAuthenticated,)
def …Run Code Online (Sandbox Code Playgroud) Django 1.7 Python 2.7
我有一个 QueryDict 对象(让我们命名它qd):
<QueryDict: {u'org': [u''], u'songs': [u'1', u'2'], u'user': [u'222'], u'name': [u'test_name']}>
Run Code Online (Sandbox Code Playgroud)
但我似乎无法获得“歌曲”的价值。
我试过了:
qd.get('songs')
qd['songs']
qd.__getitem__('songs')
Run Code Online (Sandbox Code Playgroud)
但他们都回来了u'2'。
为什么我不能得到一个列表,看起来很琐碎?