在population函数中编辑字典(在函数中迭代)以自动填充视图,点赞



我认为这基本上是一个迭代问题(实际上与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

最新更新