我认为这基本上是一个迭代问题(实际上与Django无关),尽管我正在用Django学习探戈,练习第5章(数据库)末尾的内容。使用Django 2.1和Python 3.7。
目标是更改填充脚本,以便添加"类别"的属性"点赞"one_answers"视图">
已经更改了我的模型,这很好(可以在管理中看到零点赞和视图,第一个链接到代码工作)。
原始代码,作品:https://pastebin.com/Q09XJtvX
cats = {"Python": {"pages": python_pages},
"Django": {"pages": django_pages},
"Other Frameworks": {"pages": other_pages} }
和
def add_cat(name, views=0, likes=0):
c = Category.objects.get_or_create(name=name)[0]
c.views=views
c.likes=likes
c.save()
return c
代码已修改(第42-51行和第74行已修改),不起作用:https://pastebin.com/gqsAd8iS
cats = {
{"Python": {"pages": python_pages},
"views":128,
"likes":64},
{"Django": {"pages": django_pages},
"views":64,
"likes":32},
{"Other Frameworks": {"pages": other_pages},
"views":32,
"likes":16} }
和
def add_cat(name, views, likes):
c = Category.objects.get_or_create(name=name)[0]
c.views=views
c.likes=likes
c.save()
return c
如果我在类别周围保留花括号,我会得到错误"unshable-type:dict"。如果我将它们改为方括号,我就会得到错误"list"对象没有属性"items">
***编辑以进一步澄清:如果使用方括号(字典列表),错误为:
File "populate_rango.py", line 82 in <module> populate
File "populate_rango.py", line 54 in populate for cat
for cat, cat_data in cats.items():
AttributeError: 'list' object has no attribute 'items'
所指的行(54)是:
for cat, cat_data in cats.items():
c = add_cat(cat)
for p in cat_data["pages"]:
add_page(c, p["title"], p["url"])
结束编辑。***
在Django的早期版本中,其他人似乎只是手动创建每个条目(即,类似的问题,但不是我在这里寻求的答案:Python/Django TangoWithDjango Models and Databases)。对我来说,应该有一种方法来设置点赞/访问的值,然后将它们传递给构成类别的函数。但我似乎无法做到这一点。
提前谢谢。
编辑2****
正如评论中所指出的,如果我在第55行将cats.items():更改为cats:,我将得到
not enough values to unpack (expected 2)
如果我把线路改成
for cat, views, likes, in cats:
然后我得到:
File 'populate_rango.py', line 57, in
populate for p in cate_data["pages":
NameError: name 'cat_data' is not defined
结束编辑2****
您还没有说明要更改哪些括号。目前,您只有一个包含dict的集合,这是不可能的。你需要一个格言列表:
cats = [
{"Python": {"pages": python_pages},
"views":128,
"likes":64},
...
]
编辑
正如我在评论中所说,您需要一个嵌套循环。外部循环需要对dicts进行迭代,内部循环则像以前一样对项进行迭代。
for category in cats:
for cat, cat_data in category.items():
c = add_cat(cat)
for p in cat_data["pages"]:
add_page(c, p["title"], p["url"])
修改dict结构有帮助:
cats = [
{"category": "Python",
"pages": {"pages": python_pages},
"views":128,
"likes":64},
{"category": "Django",
"pages": {"pages": django_pages},
"views":64,
"likes":32},
{"category": "Other Frameworks",
"pages": {"pages": other_pages},
"views":32,
"likes":16} ]
并且稍微更改函数中的引用:
for dicts in cats:
cat = dicts["category"]
catpages = dicts["pages"]
views = dicts["views"]
likes = dicts["likes"]
c = add_cat(cat, catpages, views, likes)
for pages in catpages:
cat_data = catpages["pages"]
for p in cat_data["pages"]:
add_page(c, p["title"], p["url"])
这一直运行到第71行,当我得到:
in populate
for p in catdata["pages"]
TypeError: list indices must be integers or slices, not str.
(这涉及到制作页面,但最初的问题是关于类别。不过我还是想修复页面部分。)
对于好奇的人来说,add_cat和add_page函数是:
def add_page(cat, title, url, views=0):
p = Page.objects.get_or_create(category=cat, title=title)[0]
p.url=url
p.views=views
p.save()
return p
def add_cat(cat, catpages, views, likes):
c = Category.objects.get_or_create(name=cat)[0]
c.views = views
c.likes = likes
c.save()
return c