让 Django 完成翻译:迁移数据库

2017-04-0880710 阅读151 评论

我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。

迁移数据库

为了让 Django 完成翻译,创建好这些数据库表,我们再一次请出我的工程管理助手 manage.py。激活虚拟环境,切换到 manage.py 文件所在的目录下,分别运行 python manage.py makemigrationspython manage.py migrate 命令:

C:\WINDOWS\system32>C:\Users\yangxg\Envs\blogproject_env\Scripts\activate

(blogproject_env) C:\WINDOWS\system32>cd C:\Users\yangxg\Workspace\blogproject

(blogproject_env) C:\Users\yangxg\Workspace\blogproject>python manage.py makemigrations
Migrations for 'blog':
  blog\migrations\0001_initial.py:
    - Create model Category
    - Create model Post
    - Create model Tag
    - Add field tags to post

(blogproject_env) C:\Users\yangxg\Workspace\blogproject>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, blog, contenttypes, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying blog.0001_initial... OK
  Applying sessions.0001_initial... OK

注意:如果代码中含有中文注释,且你使用的是 Python 2 开发环境的话,会得到一个编码错误。因此请在含有中文注释的文件最开始处加入编码声明:# coding: utf-8。

当我们执行了 python manage.py makemigrations 后,Django 在 blog 应用的 migrations 目录下生成了一个 0001_initial.py 文件,这个文件是 Django 用来记录我们对模型做了哪些修改的文件。目前来说,我们在 models.py 文件里创建了 3 个模型类,Django 把这些变化记录在了 0001_initial.py 里。

不过此时还只是告诉了 Django 我们做了哪些改变,为了让 Django 真正地为我们创建数据库表,接下来又执行了 python manage.py migrate 命令。Django 通过检测应用中 migrations 目录下的文件,得知我们对数据库做了哪些操作,然后它把这些操作翻译成数据库操作语言,从而把这些操作作用于真正的数据库。

你可以看到命令的输出除了 Applying blog.0001_initial... OK 外,Django 还对其它文件做了操作。这是因为除了我们自己建立的 blog 应用外,Django 自身还内置了很多应用,这些应用本身也是需要存储数据的。可以在 settings.py 的 INSTALLED_APP 设置里看到这些应用,当然我们目前不必关心这些。

blogproject/settings.py

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'blog',
]

对于了解数据库语言的人,你可以运行下面的命令看看 Django 究竟为我们做了什么:

python manage.py sqlmigrate blog 0001

你将看到输出了经 Django 翻译后的数据库表创建语句,这有助于你理解 Django ORM 的工作机制。

选择数据库版本

我们没有安装任何的数据库软件,Django 就帮我们迁移了数据库。这是因为我们使用了 Python 内置的 SQLite3 数据库。

SQLite3 是一个十分轻巧的数据库,它仅有一个文件。你可以看一到项目根目录下多出了一个 db.sqlite3 的文件,这就是 SQLite3 数据库文件,Django 博客的数据都会保存在这个数据库文件里。

Django 在 settings.py 里为我们做了一些默认的数据库配置:

blogproject/settings.py

## 其它配置选项...
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
## 其它配置选项...

可以看到默认的数据库引擎就是使用的 SQLite3。

当然一些人倾向于使用 MySQL 等大型数据库,至于 Django 如何配置 MySQL 这里就不赘述了,你可以自行使用搜索引擎或者查阅 Django 的官方文档解决。对于一个小型博客而言,SQLite3 数据库足以胜任。

用 Django 的方式操作数据库

数据库最主要的操作就是往里面存入数据、从中取出数据、修改已保存的数据和删除不再需要的数据。和创建数据库表一样,Django 为这些操作提供了一整套方法,从而把我们从数据库语言中解放出来。我们不用学习如何利用数据库语言去完成这些操作,只要简单地调用几个 Python 函数就可以满足我们的需求。

存数据

先在命令行中来探索一下这些函数,感受一下如何用 Django 的方式来操作数据库。在 manage.py 所在目录下运行 python manage.py shell 命令:

(blogproject_env) C:\Users\yangxg\Workspace\blogproject>python manage.py shell
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>

这打开了一个交互式命令行。

首先我们来创建一个分类和一个标签:

>>> from blog.models import Category, Tag, Post
>>> c = Category(name='category test')
>>> c.save()
>>> t = Tag(name='tag test')
>>> t.save()

我们首先导入 3 个之前写好的模型类,然后实例化了一个 Category 类和一个 Tag 类,为他们的属性 name 赋了值。为了让 Django 把这些数据保存进数据库,调用实例的 save 方法即可。

再创建一篇文章试试,但创建文章之前,我们需要先创建一个 User,用于指定文章的作者。创建 User 的命令 Django 已经帮我们写好了,依然是通过 manage.py 来运行。首先按住 Ctrl + c 退出命令交互栏(一次退不出就连续多按几次),运行 python manage.py createsuperuser 命令并根据提示创建用户:

(blogproject_env) C:\Users\yangxg\Workspace\blogproject>python manage.py createsuperuser
Username (leave blank to use 'zmrenwu@163.com'): myuser
Email address: a@aa.com
Password:
Password (again):
Superuser created successfully.

运行 python manage.py createsuperuser 开始创建用户,之后会提示你输入用户名、邮箱、密码和确认密码,按照提示输入即可。注意一点的是密码输入过程中不会有任何字符显示,不要误以为你的键盘出问题了,正常输入即可。最后出现 Superuser created successfully. 说明用户创建成功了。

再次运行 python manage.py shell 进入 Python 命令交互栏,开始创建文章:

>>> from blog.models import Category, Tag, Post
>>> from django.utils import timezone
>>> from django.contrib.auth.models import User

>>> user = User.objects.get(username='myuser')
>>> c = Category.objects.get(name='category test')

>>> p = Post(title='title test', body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
>>> p.save()

由于我们重启了 shell,因此需要重新导入了 CategoryTagPost 以及 User。我们还导入了一个 Django 提供的辅助模块 timezone,这是因为我们需要调用它的 now() 方法为 created_timemodified_time 指定时间,容易理解 now 方法返回当前时间。然后我们根据用户名和分类名,通过 get 方法取出了存在数据库中的 UserCategory(取数据的方法将在下面介绍)。接着我们为文章指定了 titlebodycreated_timemodified_time值,并把它和前面创建的 Category 以及 User 关联了起来。允许为空 excerpttags 我们就没有为它们指定值了。

注意:我们这里使用 get 方法根据 Categoryname 属性的值获取分类的一条记录。Category.objects.get(name='category test') 的含义是从数据库中取出 name 的值为 category test 的分类记录。确保数据库中只有一条值为 category test 的记录,否则 get 方法将返回一个 MultipleObjectsReturned 异常。如果你不小心已经存了多条记录,请删掉多余的记录。如何删除数据请看下文。

取数据

数据已经存入数据库了,现在要把它们取出来看看:

>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>>

objects 是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all 方法,表示我们要把对应的数据全部取出来。可以看到 all 方法都返回了数据,这些数据应该是我们之前存进去的,但是显示的字符串有点奇怪,无法看出究竟是不是我们之前存入的数据。为了让显示出来的数据更加人性化一点,我们为 3 个模型分别增加一个 __str__ 方法:

blog/models.py

from django.utils.six import python_2_unicode_compatible

# python_2_unicode_compatible 装饰器用于兼容 Python2
@python_2_unicode_compatible
class Category(models.Model):
    ...

    def __str__(self):
        return self.name

@python_2_unicode_compatible
class Tag(models.Model):
    ...

    def __str__(self):
        return self.name

@python_2_unicode_compatible
class Post(models.Model):
    ...

    def __str__(self):
        return self.title

定义好 __str__ 方法后,解释器显示的内容将会是 __str__ 方法返回的内容。这里 Category 返回分类名 nameTag 返回标签名,而 Post 返回它的 title

python_2_unicode_compatible 装饰器用于兼容 Python2。如果你使用的 Python3 开发环境,去掉这个装饰器不会有任何影响。如果你使用的 Python2 开发环境,而又不想使用这个装饰器,则将 __str__ 方法改为 __unicode__ 方法即可。

先按 Ctrl + c 退出 Shell,再重新运行 python manage.py shell 进入 Shell。

>>> from blog.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]>

>>> Tag.objects.all()
<QuerySet [<Tag: tag test>]>

>>> Post.objects.all()
<QuerySet [<Post: title test>]>

>>> Post.objects.get(title='title test')
<Post: title test>

可以看到返回的是我们之前存入的数据。

此外我们在创建文章时提到了通过 get 方法来获取数据,这里 all 方法和 get 方法的区别是:all 方法返回全部数据,是一个类似于列表的数据结构(QuerySet);而 get 返回一条记录数据,如有多条记录或者没有记录,get 方法均会抛出相应异常。

改数据

尝试修改数据:

>>> c = Category.objects.get(name='category test')
>>> c.name = 'category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: test category new>]>

首先通过 get 方法根据分类名 name 获取值为 category test 到分类,修改它的 name 属性为新的值 category test new,然后调用 save 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。TagPost 的修改也一样。

删数据

删除掉数据:

>>> p = Post.objects.get(title='title test')
>>> p
<Post: title test>
>>> p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
>>> Post.objects.all()
<QuerySet []>

先根据标题 title 的值从数据库中取出 Post,保存在变量 p 中,然后调用它的delete 方法,最后看到 Post.objects.all() 返回了一个空的 QuerySet(类似于一个列表),表明数据库中已经没有 Post,Post 已经被删除了。

这就是 Django 对数据库增、删、改、查的操作。除了上述演示的方法外,Django 还为我们提供了大量其它的方法,这些方法有一部分会在教程中使用,用到时我会讲解它们的用法。但以后你开发自己的项目时,你就需要通过阅读 Django 的官方文档 来了解有哪些方法可用以及如何使用它们。

总结

本章节的代码位于:Step4: make migrations and migrate

如果遇到问题,请通过下面的方式寻求帮助。

-- EOF --

151 评论
登录后回复
Zuwang Dai
2019-05-18 15:42:45

博主你好,请问如何在python shell中启用代码补全功能呢?

主要是手动输入太繁琐了......我觉得应该有自动补全功能。

但是我google的结果都不甚明了,因此想知道博主是如何解决的。

本人使用的是 VS Code,操作系统是Windows 10,Python 3.7

回复
MiracleWong Zuwang Dai
2019-06-07 22:33:36

试了一下,如果你的Python中安装了IPython的话,在python manage.py shell 的时候,是直接进入到IPython的,可以使用自动补全的。

回复
VG噶油
2019-04-29 11:24:27

博主,您好。我想请教一下这个问题,输入c=Category.objects.get(name='category test'),会为什么会提示:

blog.models.DoesNot Exist :Category matching query does not exist

也就是这样:

>>> c = Category.objects.get(name='category test')Traceback (most recent call last):  File "<console>", line 1, in <module>  File "C:\Mywork\blogproject_env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method    return getattr(self.get_queryset(), name)(*args, **kwargs)  File "C:\Mywork\blogproject_env\lib\site-packages\django\db\models\query.py",line 385, in get    self.model._meta.object_nameblog.models.DoesNotExist: Category matching query does not exist.

回复
kajskj753
2019-03-22 17:18:22

Django在根据models生成数据库表时报 __init__() missing 1 required positional argument: 'on_delete'

解决办法:将有Foreignkey的代码改为:herobook=models.ForeignKey('BookInfo',on_delete=models.CASCADE,)即在外键值的后面加上 on_delete=models.CASCADE 

原因:在django2.0后,定义外键和一对一关系的时候需要加on_delete选项,此参数为了避免两个表里的数据不一致问题,不然会报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'举例说明:user=models.OneToOneField(User)owner=models.ForeignKey(UserProfile)需要改成:user=models.OneToOneField(User,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值owner=models.ForeignKey(UserProfile,on_delete=models.CASCADE) --在老版本这个参数(models.CASCADE)是默认值 

参数说明:on_delete有CASCADE、PROTECT、SET_NULL、SET_DEFAULT、SET()五个可选择的值CASCADE:此值设置,是级联删除。PROTECT:此值设置,是会报完整性错误。SET_NULL:此值设置,会把外键设置为null,前提是允许为null。SET_DEFAULT:此值设置,会把设置为外键的默认值。SET():此值设置,会调用外面的值,可以是一个函数。一般情况下使用CASCADE就可以了。

回复
deling
2019-03-07 18:40:09

博主, if not getattr(cls, self.attname, None):TypeError: getattr(): attribute name must be string  这个是什么问题

回复
追梦人物 deling
2019-03-08 12:06:25

self.attname 必须是一个字符串

回复
似此星辰非昨夜_o
2018-11-24 17:32:11

>>> p = Post.objects.get(title='title test')Traceback (most recent call last):  File "<console>", line 1, in <module>  File "D:\Django\Envs\blogproject_env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method    return getattr(self.get_queryset(), name)(*args, **kwargs)  File "D:\Django\Envs\blogproject_env\lib\site-packages\django\db\models\query.py", line 389, in get    (self.model._meta.object_name, num)blog.models.MultipleObjectsReturned: get() returned more than one Post -- it returned 2! 

>>> Post.objects.all()<QuerySet [<Post: title test>, <Post: title test>]>

有人可以帮帮我么,就是在一开始创建的时候,我不小心创建了两个title相同的对象,这就导致我在后面用title来寻找对象的时候,返回值变成了2,p无法获取这个对象的值,也就无法进行删除操作了。

回复
HakFoo
2018-09-28 14:35:37

在这条下 p = Post(title='title test', body='body test', created_time=timezone.now(    ...: ), modified_time=timezone.now(), category=c, author=user)

报错TypeError: 'created_time' is an invalid keyword argument for this function

回复
HakFoo HakFoo
2018-09-28 14:54:10

自己犯蠢了 。。。

回复
yukiyu4444
2018-08-03 09:57:01

博主,我在createsuperuser的时候报错:

File "E:/jy/blog/blogproject\blog\models.py", line 12, in Post

    author = models.ForeignKey(User)TypeError: __init__() missing 1 required positional argument: 'on_delete'


是不是ForeignKey里面缺少什么东西,请求帮助~

回复
yukiyu4444 yukiyu4444
2018-08-03 10:01:43

看网上说 Django2才会需要on_delete,可是我装的确实是1.10.6,也开了虚拟环境

回复
yukiyu4444 yukiyu4444
2018-08-03 10:14:52

哈哈我自己解决啦,不麻烦博主了~

回复
子房 yukiyu4444
2019-03-02 15:10:39

请问你是如何解决的呢

回复
Chen
2018-06-19 21:10:17

进入 python manage.py shell  后

>>> from blog.models import Category, Tag, Post 

>>> from django.utils import timezone 

>>> from django.contrib.auth.models import User 

>>> user = User.objects.get(username='myuser') 

>>> c = Category.objects.get(name='category test') 

Traceback (most recent call last):  File "<console>", line 1, in <module>  File "C:\Python36\lib\site-packages\django\db\models\manager.py", line 85, in manager_method    return getattr(self.get_queryset(), name)(*args, **kwargs)  File "C:\Python36\lib\site-packages\django\db\models\query.py", line 389, in get    (self.model._meta.object_name, num)blog.models.MultipleObjectsReturned: get() returned more than one Category -- it returned 2! 

在这里出现了报错信息,不知道是不是哪一步做错了,还是?

我一直在 models  这里疑惑,谢谢解答!

回复
schunlee Chen
2018-07-24 06:47:12

MultipleObjectsReturned: get() returned more than one Category


obj.objects.get方法只能返回一个对象,空或多个符合要求对象都会抛错。

回复
afrunk
2018-05-21 12:57:36

你好,我在用django的方法操作数据库的时候无法存入数据.我在pycharm的terminal中的打开python shell 运行的以上命令.在第一条的时候就报错没有设置.

>>> from blog.models import CategoryTraceback (most recent call last):  File "<stdin>", line 1, in <module>  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\blogproject\blog\models.py", line 2, in <module>    from django.contrib.auth.models import User  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\contrib\auth\models.py", line 4, in <module>    from django.contrib.auth.base_user import AbstractBaseUser, BaseUserManager  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\contrib\auth\base_user.py", line 52, in <module>    class AbstractBaseUser(models.Model):  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\contrib\auth\base_user.py", line 53, in AbstractBaseUser    password = models.CharField(_('password'), max_length=128)  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\db\models\fields\__init__.py", line 1043, in __init__    super(CharField, self).__init__(*args, **kwargs)  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\db\models\fields\__init__.py", line 166, in __init__    self.db_tablespace = db_tablespace or settings.DEFAULT_INDEX_TABLESPACE  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\conf\__init__.py", line 53, in __getattr__    self._setup(name)  File "F:\Python_Data\Scrapy_Django\12306_Scrapy\Django\Django_meng\lib\site-packages\django-1.10.6-py3.6.egg\django\conf\__init__.py", line 39, in _setup    % (desc, ENVIRONMENT_VARIABLE))django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must eitherdefine the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

是否是因为我用的python3.6不支持django1.1版本

回复
追梦人物 afrunk
2018-05-23 12:14:53

并不是,pycharm 你可以直接打开 django shell,而不是在 terminal 中运行 python shell

回复
schunlee 追梦人物
2018-07-24 06:49:37

请问pycharm中如何打开django shell,哪个按钮?

回复
阿米-Cc
2018-05-13 17:06:31

请问为什么在改数据的时候执行c = Category.objects.get(name='category test')不会返回<Category: category test>

回复
阿米-Cc 阿米-Cc
2018-05-13 17:07:38

明白了哈

回复
xiaopanddxiong
2018-04-10 15:08:31

太赞了  学习了!感谢哈

回复
Sagittariussun
2018-03-06 20:18:12

博主你好,为什么会出现这种状况啊,求解决

>>> Post.objects.all()<QuerySet [<Post: Post object>, <Post: Post object>]>

回复
zzz Sagittariussun
2018-07-10 20:03:57

因为__str__中str左右两边各有两个下划线,而不是各有一个

回复
wenthomas
2018-03-01 19:07:02

博主您好,我想问一下我的时区已经做好了配置修改,但是在这一章创建了数据后进blog_post文章表发现created_time和modified_time还是UTC时间,并没有正确显示中国时区,请问这个是怎么回事?

settings.py :

LANGUAGE_CODE = 'zh-Hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = True
回复
fans
2018-01-31 14:25:24

t = Tag(name='tag test')执行时报错:

 TypeError: __init__() got an unexpected keyword argument 'name'

检查数据库,是有这个字段的,可以用sql插入数据,这是什么原因?

回复
passer-byzhang
2018-01-25 22:17:54

博主您好,我在

>>>from blog.models import Category, Tag, Post 

>>> c = Category(name='category test')

 >>> c.save()

 >>> t = Tag(name='tag test')

 >>> t.save()  之后   CTRL-C进行保存,报了如下错误
Traceback (most recent call last):  File "manage.py", line 22, in <module>    execute_from_command_line(sys.argv)  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line    utility.execute()  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 359, in execute    self.fetch_command(subcommand).run_from_argv(self.argv)  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\core\management\base.py", line 306, in run_from_argv    connections.close_all()  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\db\utils.py", line 234, in close_all    connection.close()  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\db\backends\sqlite3\base.py", line 235, in close    BaseDatabaseWrapper.close(self)  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\db\backends\base\base.py", line 272, in close    self._close()  File "C:\Users\pc\blog\blogproject_env\lib\site-packages\django\db\backends\base\base.py", line 221, in _close    return self.connection.close()KeyboardInterrupt

这说明我的哪个步骤没有配置好啊

回复
lamber passer-byzhang
2018-03-02 15:07:26

你别用ctrl+c啊。。那样直接就跳出去了,你看你报错KeyBoardInterrupt

回复
Blake Peng
2018-01-23 14:08:36

博主,我遇到了这个问题:

Traceback (most recent call last):  File "manage.py", line 15, in <module>    execute_from_command_line(sys.argv)  File "F:\Envs\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 371, in execute_from_command_line    utility.execute()  File "F:\Envs\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 347, in execute    django.setup()  File "F:\Envs\blogproject_env\lib\site-packages\django\__init__.py", line 24, in setup    apps.populate(settings.INSTALLED_APPS)  File "F:\Envs\blogproject_env\lib\site-packages\django\apps\registry.py", line 112, in populate    app_config.import_models()  File "F:\Envs\blogproject_env\lib\site-packages\django\apps\config.py", line 198, in import_models    self.models_module = import_module(models_module_name)  File "F:\Envs\blogproject_env\lib\importlib\__init__.py", line 126, in import_module    return _bootstrap._gcd_import(name[level:], package, level)  File "<frozen importlib._bootstrap>", line 994, in _gcd_import  File "<frozen importlib._bootstrap>", line 971, in _find_and_load  File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked  File "<frozen importlib._bootstrap>", line 665, in _load_unlocked  File "<frozen importlib._bootstrap_external>", line 678, in exec_module  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed  File "F:\djangoproject\blogproject\blog\models.py", line 2, in <module>    from django.conyrib.auth.models import User 

ModuleNotFoundError: No module named 'django.conyrib'


求教~

另外,我是Django2.0版本,之前按你的方法,并没有将界面改成中文。。。请问是什么情况

回复
Blake Peng Blake Peng
2018-01-23 14:20:57

没关系了~问题已经解决了

回复
Amber
2018-01-16 01:16:53

sorry,重来一遍

在输入了 

from blog.models import Category, Tag, Post
from django.utils import timezone 
from django.contrib.auth.models import User >>> user = User.object.get(user = 'myuser')
django.core.exceptions.FieldError: Cannot resolve keyword 'user' into field. Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, post, user_permissions, username
回复
追梦人物 Amber
2018-01-16 13:31:43

你的 User 模型中没有定义 user 这个属性吧?

回复
Amber
2018-01-16 01:14:40

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}span.s1 {font-variant-ligatures: no-common-ligatures}user = User.objects.get(user = 'myuser')

然后出错

p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 11.0px Menlo; color: #000000; background-color: #ffffff}span.s1 {font-variant-ligatures: no-common-ligatures} "Choices are: %s" % (name, ", ".join(available)))django.core.exceptions.FieldError: Cannot resolve keyword 'user' into field. Choices are: date_joined, email, first_name, groups, id, is_active, is_staff, is_superuser, last_login, last_name, logentry, password, post, user_permissions, username

回复
阿芽今天很元气
2018-01-08 19:03:35

博主,运行python3 manage.py makemigrations 命令的时候报错了==结尾是这样的 SyntaxError: (unicode error) 'utf-8' codec can't decode byte 0xc7 in position 14: invalid continuation byte  我在models里面加了# coding: utf-8和没加都是一样的结果。我的Python是3.6.4的 Django是1.10.6的

回复
hopeknow 阿芽今天很元气
2018-01-09 20:48:11

 编译的py文件保存时选择utf-8格式!应该是文本编辑器保存时默认为其它格式了。

回复
量飞
2018-01-05 09:46:56

这里可以安装 pip install ipython 这个库,使交互操作更加智能。

回复
小Q营姐
2017-12-21 20:34:33

真得非常感谢博主的博文,给了我很大帮助。

我的blog和blogproject文件夹下均有__pycache__文件夹,并且blogproject文件夹下的__pycache__在push时不能为.gitignore文件所屏蔽,想问一下为什么?

回复
Anderson Shao 小Q营姐
2017-12-25 22:16:58

可以屏蔽,你的.gitignore设置错误

回复
mar-zou 小Q营姐
2018-02-07 14:35:02

你需要清git缓存

回复
nordwind80
2017-12-15 12:11:00

博主你好,我是在Django 2.0上跟着你的教程学习的。当我执行 python3 manage.py makemigrations 命令时总是报错,能给我些帮助嘛?

SystemCheckError: System check identified some issues:ERRORS:blog.Post.author: (fields.E300) Field defines a relation with model 'blog.User', which is either not installed, or is abstract.blog.Post.author: (fields.E307) The field blog.Post.author was declared with a lazy reference to 'blog.user', but app 'blog' doesn't provide model 'user'.

回复
追梦人物 nordwind80
2017-12-16 21:22:47

似乎是你的 user 对象关联有问题,能否提供你的 models 相关代码?

回复
piedpiper77 追梦人物
2018-01-05 16:49:14

博主你好,我和这个小伙伴的问题一样,不知道您有解决的办法 了嘛?

回复
fans piedpiper77
2018-01-31 10:43:17

需要这样添加外键:

category = models.ForeignKey(Category, on_delete=models.CASCADE)

添加on_delete参数,原因还没搞懂。。。

回复
xushuangang
2017-11-16 19:03:06

请问下  您在数据添加时Post与Category有外键关系,直接删除Post为什么没有报错,这样会把所有的关联全部删除

个人理解 应该是先删除Category的信息,然后再删除Post的信息

回复
追梦人物 xushuangang
2017-11-18 12:21:26

django 对数据库外键的删除就是层级删除,所有关联的数据都会删掉,这样可以保证数据的一致性。

回复
Junhao Cai xushuangang
2018-01-21 21:29:20

Post与Category有外键关系,准确的说是多对一的关系,所以删除Post不会对Category有影响,相反,删除Category会把对应的所有Post级联删除(on_delete=models.CASCADE)。

回复
rookie250
2017-11-16 11:49:20

为什么叫迁移数据库? 不是用orm建数据表么?

回复
追梦人物 rookie250
2017-11-18 12:22:11

migrate 一般被翻译作迁移了,我想应该是这样,术语不重要,理解意思就好。

回复
rookie250 追梦人物
2017-11-20 18:39:22

好的 谢谢

回复
NiceAir
2017-11-12 13:20:49

求助: 我做完models.py后运行python manage.py makemigrations , 结果报错:

Traceback (most recent call last):  File "manage.py", line 22, in <module>    execute_from_command_line(sys.argv)  File "E:\python\PlaceOfLoading\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line    utility.execute()  File "E:\python\PlaceOfLoading\lib\site-packages\django\core\management\__init__.py", line 359, in execute    self.fetch_command(subcommand).run_from_argv(self.argv)  File "E:\python\PlaceOfLoading\lib\site-packages\django\core\management\base.py", line 305, in run_from_argv    self.execute(*args, **cmd_options)  File "E:\python\PlaceOfLoading\lib\site-packages\django\core\management\base.py", line 356, in execute    output = self.handle(*args, **options)  File "E:\python\PlaceOfLoading\lib\site-packages\django\core\management\commands\makemigrations.py", line 167, in handle    migration_name=self.migration_name,  File "E:\python\PlaceOfLoading\lib\site-packages\django\db\migrations\autodetector.py", line 47, in changes    changes = self._detect_changes(convert_apps, graph)  File "E:\python\PlaceOfLoading\lib\site-packages\django\db\migrations\autodetector.py", line 132, in _detect_changes    self.old_apps = self.from_state.concrete_apps  File "E:\python\PlaceOfLoading\lib\site-packages\django\db\migrations\state.py", line 180, in concrete_apps    self.apps = StateApps(self.real_apps, self.models, ignore_swappable=True)  File "E:\python\PlaceOfLoading\lib\site-packages\django\db\migrations\state.py", line 249, in __init__    raise ValueError("\n".join(error.msg for error in errors))ValueError: The field admin.LogEntry.user was declared with a lazy reference to 'users.user', but app 'users' isn't installed.

回复
追梦人物 NiceAir
2017-11-13 16:16:27

show me some code

回复
jingwz125 NiceAir
2018-01-10 17:44:25

请问一下,你的问题解决了吗,谢谢!

回复
阿四925
2017-11-06 16:50:42

    求解为什么执行python manage.py makemigrations时提醒No change detected。难道是数据模型建的时候出问题了?

    问题补充:尝试执行了python manage.py migrate.提示APP'your app name could not be found'。执行python manage.py makemigrations --empty yourappname提示No migration to apply


回复
追梦人物 阿四925
2017-11-08 11:13:49

说明你已经生成了migrations文件,运行 migrate 命令就可以了。

回复
Y才小圣
2017-10-30 20:04:33


为 3 个模型分别增加一个 __str__ 方法后,再重新运行 python manage.py shell 后报错

(blogproject_env) e:\Django\workspace\blogproject>python manage.py shell 

Traceback (most recent call last):  

File "manage.py", line 22, in <module>    execute_from_command_line(sys.argv)  

File "E:\Django\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 367, in execute_from_command_line    utility.execute()  

File "E:\Django\blogproject_env\lib\site-packages\django\core\management\__init__.py", line 341, in execute    django.setup()  

File "E:\Django\blogproject_env\lib\site-packages\django\__init__.py", line 27, in setup    apps.populate(settings.INSTALLED_APPS)  

File "E:\Django\blogproject_env\lib\site-packages\django\apps\registry.py", line 108, in populate    app_config.import_models(all_models)  

File "E:\Django\blogproject_env\lib\site-packages\django\apps\config.py", line 199, in import_models    self.models_module = import_module(models_module_name)  

File "E:\Python363\lib\importlib\__init__.py", line 126, in import_module    return _bootstrap._gcd_import(name[level:], package, level)  

File "<frozen importlib._bootstrap>", line 994, in _gcd_import  

File "<frozen importlib._bootstrap>", line 971, in _find_and_load  

File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked 

 File "<frozen importlib._bootstrap>", line 665, in _load_unlocked  

File "<frozen importlib._bootstrap_external>", line 674, in exec_module  File "<frozen importlib._bootstrap_external>", line 781, in get_code  

File "<frozen importlib._bootstrap_external>", line 741, in source_to_code  

File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed  File "e:\Django\workspace\blogproject\blog\models.py", line 20    

def __unicode__(self):                         

^TabError: inconsistent use of tabs and spaces in indentation

目前的python版本是python3.6.3.。。。。难道我这边不能添加这个方法吗?

回复
追梦人物 Y才小圣
2017-10-31 15:26:35

TabError: inconsistent use of tabs and spaces in indentation:不要混用 tab 和 空格用于缩进。

回复
Y才小圣
2017-10-29 01:13:23

# coding: utf-8 

from django.db import models 

from django.contrib.auth.models import User 

from django.utils.six import python_2_unicode_compatible

 #python_2_unicode_compatible 装饰器用于兼容 Python2 

@python_2_unicode_compatible 

class Category(models.Model): 

 name = models.CharField(max_length=100) 

 def __str__(self):        

return self.name 

 @python_2_unicode_compatible class Tag(models.Model): 

 name = models.CharField(max_length=100) 

 def __str__(self):        

return self.name 

 @python_2_unicode_compatible

 class Post(models.Model): 

 title = models.CharField(max_length=70)

 body = models.TextField()

 created_time = models.DateTimeField() 

 modified_time = models.DateTimeField() 

 excerpt = models.CharField(max_length=200,blank=True) 

 category = models.ForeignKey(Category)

tags = models.ManyToManyField(Tag,blank=True) 

 author = models.ForeignKey(User) 

 def __str__(self):        

return self.title

再次运行python3 manage.py shell的时候,报错

 File "E:\Django\workspace\blogproject\blog\models.py", line 12   

return self.name

回复
Y才小圣 Y才小圣
2017-10-29 01:21:04

当我把str方法删除,重新运行了一遍

>>> from blog.models import Category, Tag, Post 

>>> from django.utils import timezone 

>>> from django.contrib.auth.models import User

 >>> user = User.objects.get(username='Cxs')

 >>> c = Category.objects.get(name='category test')

 >>> p = Post(title='title test', body='body test', created_time=timezone.now(),modified_time=timezone.now(), category=c, author=user) 

>>> p.save()

发现了新的错误

(blogproject_env) E:\Django\workspace\blogproject>python3 manage.py shellPython 3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 07:18:10) [MSC v.1900 32 bit (Intel)] on win32Type "help", "copyright", "credits" or "license" for more information.(InteractiveConsole) 

>>> Category.objects.all() 

Traceback (most recent call last):  

File "<console>", line 1, in <module> 

NameError: name 'Category' is not defined 

>>> p = Post.objects.get(title='title test') 

Traceback (most recent call last):  

File "<console>", line 1, in <module> 

NameError: name 'Post' is not defined 

>>> p = Post.objects.get(title='title test') 

Traceback (most recent call last): 

 File "<console>", line 1, in <module> 

NameError: name 'Post' is not defined

好难搞,求解!!!我会不会就卡在这儿了??????

回复
追梦人物 Y才小圣
2017-10-29 16:03:37

从你的错误来看,好像是因为你没有在命令栏引入 Post 和 Category,重新导入后再试一次。

回复
Y才小圣 追梦人物
2017-10-30 19:59:11

为 3 个模型分别增加一个 __str__ 方法后,再重新运行 python manage.py shell 进入 Shell就开始报错了,目前的python版本是python3.6.3

回复
Y才小圣 Y才小圣
2017-10-31 17:17:36

感觉自己好蠢啊!!!这个问题卡了几天!!!!还有我用notepad++,写的,编辑器有什么好的推荐吗?

回复
阿四925 Y才小圣
2017-11-06 16:37:46

我也用的notepad++,我朋友用的pycharm。感觉不出来太大的区别

回复
jing.wang Y才小圣
2017-12-03 15:48:50

用 vim 纯文本编辑器 没有其他的毛病,只用专心代码就 ok 了

回复
HelloWorld
2017-10-23 11:49:37

使用Pycharm编码,直接tests.py编写插入数据,报错:

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS_MODULE or call settings.configure() before accessing settings.

说是settings的原因:修改:

import os 

import django

 os.environ.update({"DJANGO_SETTINGS_MODULE": "config.settings”})

django.setup()

然后运行,还是报错:

raise AppRegistryNotReady("Apps aren't loaded yet.")django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.

搜了好久都是说diango没有setup原因,但是我执行了。请博主详解

回复
追梦人物 HelloWorld
2017-10-23 12:17:25

这个问题我没有遇到过,但报错信息提示你没有指定django加载的settings文件,需要在环境变量里配置DJANGO_SETTINGS_MODULE为需要加载的settings文件,例如linux下:$:export DJANGO_SETTINGS_MODULE=config.settings

回复
HelloWorld 追梦人物
2017-10-23 12:31:54

这个配置了主要是

回复
HelloWorld 追梦人物
2017-10-23 12:33:03

Image

回复
HelloWorld 追梦人物
2017-10-23 12:33:31

然后使用命令行的方式是可以正确执行的

回复
追梦人物 HelloWorld
2017-10-24 12:12:24

那应该是pycharm配置问题了,查查文档吧,这个问题我没遇到过了。

回复
HYDE_HIDE_
2017-10-17 22:36:25

您好,我在取数据的时候,在model.py添加了博客的代码(代码是直接复制粘贴),还是不能显示str方法返回的内容。

Python是3.6.3,Django是1.11.

回复
HYDE_HIDE_ HYDE_HIDE_
2017-10-17 23:48:05

您好 已经解决了 删除装饰器就可以

回复
Y才小圣 HYDE_HIDE_
2017-10-30 20:37:25

问一下,这个问题你是这么解决的?下面是我的代码:

# coding: utf-8

 from django.db import models 

from django.db import models 

from django.contrib.auth.models import User 

from django.utils.six import python_2_unicode_compatible 


 # python_2_unicode_compatible 装饰器用于兼容 Python2

 #@python_2_unicode_compatible 

class Category(models.Model):    

 name = models.CharField(max_length=100) 

 def __str__(self):        

return self.name 

 @python_2_unicode_compatible 

class Tag(models.Model):    

name = models.CharField(max_length=100)

def __str__(self):        

return self.name 

#@python_2_unicode_compatible 

class Post(models.Model):        

title = models.CharField(max_length=70) 

body = models.TextField()     

created_time = models.DateTimeField()    

modified_time = models.DateTimeField()    

excerpt = models.CharField(max_length=200, blank=True)     

category = models.ForeignKey(Category)   

tags = models.ManyToManyField(Tag, blank=True)     

author = models.ForeignKey(User) 

def __str__(self): 

       return self.title

我这边是直接不能重新运行python manage.py shell

回复
王老哥
2017-09-29 11:38:07

前面都对,到这一步进行不下去了,求帮忙,如下所示:

>>> from django.utils import timezone

 >>> from django.contrib.auth.models import User 

>>> user = User.objects.get(username='myuser')

 Traceback (most recent call last):  File "<console>", line 1, in <module>  File "D:\wpy\learn_log\ll_env\lib\site-packages\django\db\models\manager.py", line 85, in manager_method    return getattr(self.get_queryset(), name)(*args, **kwargs)  File "D:\wpy\learn_log\ll_env\lib\site-packages\django\db\models\query.py", line 385, in get    self.model._meta.object_namedjango.contrib.auth.models.DoesNotExist: User matching query does not exist.

 >>>
请问怎么回事啊?谢谢!!!

回复
追梦人物 王老哥
2017-09-29 12:07:18

User matching query does not exist

你需要先创建用户名为 myuser 的用户

回复
-冯龙
2017-09-20 19:38:15

OperationalError: no such table: blog_category  请问这是什么意思 为什么会有这样的错误

回复
莫世威 -冯龙
2017-09-24 09:43:48

没有查找到你的blog_category数据表,请确认你是否进行了数据迁移,也就是migrate,去查看一下你的数据库中是否有这张表,希望对你有帮助

回复
-冯龙 莫世威
2017-09-25 09:18:03

好像我之前在数据迁移那里出了问题,我重新做了一遍就好了,谢谢你~

回复
黄鮕 -冯龙
2018-05-10 20:08:10

哥,你能够帮我解释一下:你是怎么重新做的一边吗?感谢!我这边遇到和你一样的问题。

回复
KingsyWu
2017-09-15 10:27:18

TypeError: 'modified_time' is an invalid keyword argument for this function

回复
KingsyWu KingsyWu
2017-09-15 10:30:07

我敲错了

回复
KingsyWu
2017-09-15 10:08:37

我用# coding: utf-8报错,

改成了# coding=utf-8就可以了

回复
parsonscp
2017-09-13 20:45:19

post保存时出现异常pytz.exceptions.UnknownTimeZoneError: 'asia/shanghai'怎么解决啊

回复
追梦人物 parsonscp
2017-09-14 10:46:02

尝试改为大写试试 Asia/Shanghai

回复
华智锋范 parsonscp
2017-09-14 10:58:33

Asia/Shanghai

注意大小写

回复
parsonscp 追梦人物
2017-09-14 21:40:54

解决了 不是大小写问题 要在settings.py文件中引入pytz模块

回复
NovAa__
2017-09-10 15:49:18

c = Category(name='category test')

这一步报错是为什么。。

TypeError: 'name' is an invalid keyword argument for this function

回复
mamami NovAa__
2017-09-10 18:07:09

c = Category.objects.get(name='category test')

应该是这个

回复
fans mamami
2018-01-31 10:52:40

这个是读数据吧,LS是想保存数据,下边会接c.save()

我也是卡到这了,不过我自己写sql插入了一条数据,解决了报错问题,但是现在是保存的都是空值!

 sqlite> select * from myapp_tag;

 id|name 

 1|test

  2|

 sqlite> 

回复
Annihilater
2017-09-07 10:45:27

在blog/models.py写入(python2环境)

 from django.utils.six import python_2_unicode_compatible    

def _unicode_(self):                 

return self.name  保存之后,再次运行

Post.objects.get(title='title test')显示结果仍然是<Post: Post object>

并不显示<Post: title test>,求解释???

回复
Annihilater Annihilater
2017-09-07 11:01:43

问题解决了,__unicode__应该是两个下划线,我只用了一个。

回复
Annihilater
2017-09-05 08:51:30

输入python manage.py makemigrations

得到django.db.utils.DatabaseError: database disk image is malformed

这个数据库磁盘映像格式错误是什么鬼?

回复
追梦人物 Annihilater
2017-09-05 10:48:01

删掉数据库重新试一下

回复
Annihilater 追梦人物
2017-09-05 14:24:00

运行python manage.py flush

还是得到django.db.utils.DatabaseError: database disk image is malformed

求解答

删除数据库怎么删?

回复
追梦人物 Annihilater
2017-09-05 15:13:06

你是 sqlite3 么,直接把项目下 db.sqlite3 文件删了即可。

回复
Annihilater 追梦人物
2017-09-07 10:44:08

是的   删除重新来一遍就好了  谢谢

回复
苏柠紫
2017-09-03 13:05:22

  File "<frozen importlib._bootstrap_external>", line 674, in exec_module  File "<frozen importlib._bootstrap_external>", line 781, in get_code  File "<frozen importlib._bootstrap_external>", line 741, in source_to_code  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed  File "D:\blogproject\blog\models.py", line 48    def __str__(self):      ^SyntaxError: invalid syntax

回复
heidanchaofanhei
2017-09-02 17:51:15

已经解决了,谢谢,因为我以为“myuser”是随便填的呢,因为我的数据库名字是“admin”,所以这个“myuser”应该对应改成admin。

回复
Ethan
2017-08-28 16:30:01

博主,您好。我在运行您的demo时,迁移数据库那步
(blogproject_env)edu@edu-T:/mnt/hgfs/GitHub/django-blog-tutorial$ python3 manage.py migrate
Failed to import the site module
Traceback (most recent call last):
File "/home/edu/share/Envs/blogproject_env/lib/python3.5/site.py", line 67, in
import os
File "/home/edu/share/Envs/blogproject_env/lib/python3.5/os.py", line 708, in
from _collections_abc import MutableMapping
ImportError: No module named '_collections_abc'
出现这个。
请问怎么办。那个模块是需要安装吗?

回复
追梦人物 Ethan
2017-08-28 16:51:07

看着像是 python自带的模块,检查一下python是否安装正确,以及python路径的设置等等。

回复
kong5kong
2017-08-28 14:23:36

博主,这是什么原因
Traceback (most recent call last):
File "manage.py", line 22, in
execute_from_command_line(sys.argv)
File "c:\xuniji\lib\site-packages\django\core\management_init_.py", line 36
7, in execute_from_command_line
utility.execute()
File "c:\xuniji\lib\site-packages\django\core\management_init_.py", line 31
6, in execute
settings.INSTALLED_APPS
File "c:\xuniji\lib\site-packages\django\conf_init_.py", line 53, in geta
ttr

self.setup(name)
File "c:\xuniji\lib\site-packages\django\conf_init
.py", line 41, in _setup

self._wrapped = Settings(settings_module)

File "c:\xuniji\lib\site-packages\django\conf_init_.py", line 97, in init
__
mod = importlib.import_module(self.SETTINGS_MODULE)
File "c:\python27\Lib\importlib__init
.py", line 37, in import_module
import(name)
File "C:\blogproject\blogproject\settings.py", line 50
SyntaxError: Non-ASCII character '\xe6' in file C:\blogproject\blogproject\setti
ngs.py on line 50, but no encoding declared; see http://python.org/dev/peps/pep-
0263/ for details

回复
追梦人物 kong5kong
2017-08-28 16:52:43

编码问题,如果你使用 py2,需要在文件开头部分做编码说明。

回复
heidanchaofanhei
2017-08-27 23:11:44

请教一个问题:

from blog.models import Category, Tag, Post
from django.utils import timezone
from django.contrib.auth.models import User
user = User.objects.get(username='myuser')

我输入完上面代码,然后就报错了,报错内容:
django.contrib.auth.models.DoesNotExist: User matching query does not exist.

大家帮忙看一下,谢谢,现在卡在这了

回复
追梦人物 heidanchaofanhei
2017-08-28 16:55:42

首先需要创建一个名为 myuser 的用户才能从数据库取值。

回复
霜华长安
2017-08-05 10:53:45

输入python manage.py makemigrations后显示为这个
Traceback (most recent call last):
File "manage.py", line 15, in
execute_from_command_line(sys.argv)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\sit
e-packages\django-2.0-py3.5.egg\django\core\management_init_.py", line 365, i
n execute_from_command_line
utility.execute()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\sit
e-packages\django-2.0-py3.5.egg\django\core\management_init_.py", line 341, i
n execute
django.setup()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\sit
e-packages\django-2.0-py3.5.egg\django_init_.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\sit
e-packages\django-2.0-py3.5.egg\django\apps\registry.py", line 112, in populate
app_config.import_models()
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\sit
e-packages\django-2.0-py3.5.egg\django\apps\config.py", line 198, in import_mode
ls
self.models_module = import_module(models_module_name)
File "C:\Users\Administrator\AppData\Local\Programs\Python\Python35-32\lib\imp
ortlib_init_.py", line 126, in import_module
return bootstrap._gcd_import(name[level:], package, level)
File "", line 985, in _gcd_import
File "", line 968, in _find_and_load
File "", line 957, in _find_and_load_unlocked
File "", line 673, in _load_unlocked
File "", line 697, in exec_module
File "", line 222, in _call_with_frames_removed
File "C:\Users\Administrator\workspace\blogproject\blog\models.py", line 27, i
n
class Post(models.Model):
File "C:\Users\Administrator\workspace\blogproject\blog\models.py", line 54, i
n Post
category = models.ForeignKey(Category)
TypeError: __init_
() missing 1 required positional argument: 'on_delete'

回复
追梦人物 霜华长安
2017-08-05 18:35:51

TypeError: init() missing 1 required positional argument: 'on_delete'

Foreinkey 可以设置 on_delete=models.CASCADE

回复
zhuxinxia1992
2017-07-25 16:04:31

您好,python manage.py makemigrations 和 python manage.py migrate 显示No changes detected,No migrations to apply.而我的migrations文件夹只显示__init__.py文件,并没有其他文件。应该如何解决?

回复
zhuxinxia1992 zhuxinxia1992
2017-07-25 16:09:05

忽略,已解决,原因是没有在setting.py加入‘blog’

回复
hello羊妹儿
2017-07-24 08:47:58

您好,请问这个怎么处理,是错误吗,搜到的都和这个不太一样

Post.objects.get(title='title test')
Traceback (most recent call last):
File "", line 1, in
File "C:\Python27\lib\site-packages\django\db\models\manager.py", line 85, inmanager_method
return getattr(self.get_queryset(), name)(args, *kwargs)
File "C:\Python27\lib\site-packages\django\db\models\query.py", line 384, in get
(self.model._meta.object_name, num)
MultipleObjectsReturned: get() returned more than one Post -- it returned 2!

回复
追梦人物 hello羊妹儿
2017-07-24 20:59:34

你这个因为有多条记录返回,所以使用 get 会抛出异常。可以删掉重复记录,或者删掉全部数据按照教程重开。

回复
hello羊妹儿 追梦人物
2017-07-24 22:15:53

谢谢博主,比对了你的代码把测试的两个test删了,已经可以啦

回复
Mr.Lv@Li
2017-07-16 21:00:44

那个Category有object这个属性?我报错了额。。。
这是怎么回事呢?

回复
Mr.Lv@Li Mr.Lv@Li
2017-07-16 21:06:11

没有加s

回复
Mr.Lv@Li
2017-07-15 17:53:05

你好,原来是存在migrations\这个文件的,我不小心删掉了,现在再python manage.py makemigrations 和 python manage.py migrate 显示No changes detected,怎么办,没法完成接下来的工作了,还有我用到c.save(),出现了错误信息,怎么回事呢,麻烦博主了,谢谢。

回复
追梦人物 Mr.Lv@Li
2017-07-19 12:45:58

只能够删掉全部 migrations 文件和数据库文件,然后重新生成。

回复
zhuxinxia1992 Mr.Lv@Li
2017-07-25 16:05:46

您好,请问您的问题解决了么?是如何解决的呢?

回复
Mr.Lv@Li zhuxinxia1992
2017-07-25 19:45:21

我重建一个博客,按照上面的步骤,很快的,又能温故而知新,不在这些问题上钻牛角尖的浪费时间。

回复
ed2x Mr.Lv@Li
2017-09-13 13:34:12

python manage.py makemigrations blog

回复
y-xiang ed2x
2018-01-31 13:46:13

多谢老哥!

回复
ShayChris
2017-07-04 15:05:30

已经设置Post里的tag为blank=True,然后在命令行里p2 = Post(title = 'title test', body='body test', create_time=timezone.now(),modified_time=timezone.now(), category=c, author=user)成功,但是p2.save()时就出下面这个错误
django.db.utils.IntegrityError: NOT NULL constraint failed: blog_post.tag_id,求解,多谢多谢

回复
ShayChris ShayChris
2017-07-04 15:07:44

将tag加上之后就可以保存

回复
rockfire ShayChris
2017-07-04 15:50:41

tag=models.ManyToManyField(Tag,blank=True)
你是没加blank=True吧

回复
ShayChris rockfire
2017-07-04 16:17:06

class Post(models.Model):
tag = models.ForeignKey(Tag, blank=True)
我是这样写的,应该没问题吧?

回复
zabida ShayChris
2018-01-29 20:43:55

老铁,一样的问题啊

回复
宝子要加油
2017-06-28 11:49:06

添加了 _str_之后依旧无法显示数据的具体内容。我用的是Python3.6, Django 1.11, 之前在官网教程练习的时候,这个功能还是好使的,不知道为啥现在突然怎么样都显示不出来了。求教!

回复
追梦人物 宝子要加油
2017-06-29 14:50:36

有两个下划线 str

回复
AL拒绝拖延
2017-06-24 17:39:55

p = Post(title='title test', body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user) 写入语句时候,提示我TypeError: 'created_ti' is an invalid keyword argument for this function 求求求

回复
AL拒绝拖延 AL拒绝拖延
2017-06-24 17:54:33

TypeError: 'created_time' is an invalid keyword argument for this function 这是报错 上面的 贴错了

回复
追梦人物 AL拒绝拖延
2017-06-24 20:33:20

检查模型中 created time 是否拼错了。

回复
AL拒绝拖延 追梦人物
2017-06-25 09:29:13

没有 拼错..我重新从你的代码里面 粘贴过去了 还是不行.... 我用的python3.6

回复
AL拒绝拖延 追梦人物
2017-06-25 10:24:02

帅哥,我知道怎么回事了 昨天我是表的 列created_time 拼写错了 然后我改了之后 我没有重新移数据库 然后运行写入Post(....)信息的时候 就会报上面的错... 这次出这个问题 基本上 这块算是懂了 谢谢哈

回复
逐殇小彬
2017-06-19 22:48:33

c = Category.objects.get(name='category test')
报错:
DoesNotExist: Category matching query does not exist
----------这个是哪里有问题 求救

回复
追梦人物 逐殇小彬
2017-06-19 23:34:22

这条记录不存在,先创建一条,再取。

回复
逐殇小彬 追梦人物
2017-06-20 10:30:28

谢谢 遗漏了
这边还有两个问题 麻烦了
1、python manage.py migrate news
报错 column slug is not unique 这个是什么原因?
2、这边想删除sqlite3的表 都是输入报错
Python manage.py dbshell
报错 You appear not tohave the sqlite3 program installed or on your path

麻烦博主

回复
追梦人物 逐殇小彬
2017-06-20 10:33:04

column slug is not unique 确保值唯一

Python manage.py dbshell 你没有 sqlite3 客户端

回复
天地之春
2017-06-08 23:00:26

运行后,migrations没有001这个文件呢

回复
追梦人物 天地之春
2017-06-08 23:05:33

具体情况是?没有把 blog 加入 settings.py?

回复
天地之春 追梦人物
2017-06-09 10:31:13

感谢 已经解决

回复
回不去的木木
2017-06-02 11:23:38

忘记了设置的密码怎么找回来呢?

回复
追梦人物 回不去的木木
2017-06-02 11:58:17

重新创建一个 super user 吧。

回复
rockfire 回不去的木木
2017-06-25 10:40:50

python manage.py changepassword

回复
木瑾_37436
2017-05-29 08:28:53

运行python manage.py makemigrations命令是报错:name "User" is not defined是怎么回事啊,要怎么处理

回复
木瑾_37436 木瑾_37436
2017-05-29 08:55:41

已经好了,是开始是忘记import user了, 囧

回复
刘智彬会灰 木瑾_37436
2017-06-26 16:37:36

一开始我也没import user,捣鼓了一大轮才发现是抄漏了。。。。。。

回复
liuchengfei
2017-05-12 15:28:14

运行 c = Category.objects.get(name='category test')时报错,blog.models.MultipleObjectsReturned : get()returned more than one Gategory--it returnde 3

回复
追梦人物 liuchengfei
2017-05-12 16:29:37

这说明已经在数据库中存在多个这样的数据,所以用 get 就会报错,先调用 Category.objects.all().delete() 删掉重新添加一个。

回复
liuchengfei
2017-05-11 15:33:47

为什么我输入ctrl+c,不能退出交互模式,而是提示keyboardinterrupt

回复
追梦人物 liuchengfei
2017-05-11 16:24:10

多按几次应该就可以啦。

回复
gleesu liuchengfei
2017-05-12 15:44:19

我在ubuntu下面也是这样,用ctrl+D就跳出来了。

回复
zxt 追梦人物
2017-08-06 10:30:41

博主,多按几次还是没用咋办

回复
追梦人物 zxt
2017-08-06 11:04:01

。。ctrl+D,或者直接关了重开。

回复
IHaoMing zxt
2017-08-18 22:00:15

exit()函数可以退出

回复
tianjigor
2017-05-09 23:54:03

py2.7,直接重写
def str(self):
return self.name
就OK了

回复