Django之模型

在web应用中,经常涉及到和数据库的的交互,比如我们在京东上买一个东西,查询的时候网站会自动转到后端数据库去查询,然后呈现在网页上

Django 里更关注的是模型(Model)、模板(Template)和视图(Views),Django也被称为 MTV 框架 。在 MTV 开发模式中:

M 代表模型(Model),即数据存取层。 该层处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。

T 代表模板(Template),即表现层。 该层处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。

V 代表视图(View),即业务逻辑层。 该层包含存取模型及调取恰当模板的相关逻辑。 你可以把它看作模型与模板之间的桥梁。

 

对于数据库,我们可以用Mysql进行存储,如下面的代码:
def book_list(request):
    db = MySQLdb.connect(user='me', db='mydb', passwd='secret', host='localhost')
    cursor = db.cursor()
    cursor.execute('SELECT name FROM books ORDER BY name')
    names = [row[0] for row in cursor.fetchall()]
    db.close()
    return render('book_list.html', {'names': names})
但是每次进行存储和取数据的时候都得进行数据库连接,不是很方便。好在Django内置了继承了sqlite数据库。我们可以直接使用。在setting.py文件中有如下的默认定义,可以看到引擎使用的是sqlite3,路径在工程路径下,名字是db.sqlite3

 
在工程界面下,可以看到db.sqlite3文件

 
Django采用模型在后台执行SQL代码并把结果用python的数据结果来描述。这样的好处是你在写处理函数的时候,只需要考虑python代码,不用再PythonSQL代码之间来回切换。另外由于django可以配置不同的数据库,不同的数据库平台存在兼容性问题,因此使用python描述数据结构可以适用不同的平台
下面我们就来建立自己的模型:
首先在models.py中定义如下数据模型:定义了3个模型,一个是出版商,一个是作者,一个是书籍。从定义中可以看出,每个类型包含不同的属性。且每个属性有不同的类型,比如是字符类的,时间类的。和数据库语言差不多是类似的
比如SQL中建立一个表CREATE TABLE Publisher(name char(30),address char(30))。所以每个模型就可以认为是一个表
class Publisher(models.Model):

    name = models.CharField(max_length=30)

    address = models.CharField(max_length=50)

    city = models.CharField(max_length=60)

    state_province = models.CharField(max_length=30)

    country = models.CharField(max_length=50)

    website = models.URLField()



class Author(models.Model):

    first_name = models.CharField(max_length=30)

    last_name = models.CharField(max_length=40)

    email = models.EmailField()



class Book(models.Model):

    title = models.CharField(max_length=100)

    authors = models.ManyToManyField(Author) //这个字段是多对多的字段,表示一个数据有多个作者

    publisher = models.ForeignKey(Publisher)

    publication_date = models.DateField()
另外每个模型都是models.Model的子类,它的父类Model包含了所有和数据库进行交互的方法。
pycharm的终端上执行python manage.py makemigrations命令,可以看到系统开始创建数据表

 
此时才生成initial.py文件

 
代码如下:
class Migration(migrations.Migration):



    initial = True



    dependencies = [

    ]



    operations = [

        migrations.CreateModel(

            name='Author',

            fields=[

                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

                ('first_name', models.CharField(max_length=30)),

                ('last_name', models.CharField(max_length=40)),

                ('email', models.EmailField(max_length=254)),

            ],

        ),

        migrations.CreateModel(

            name='Book',

            fields=[

                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

                ('title', models.CharField(max_length=100)),

                ('publication_date', models.DateField()),

                ('authors', models.ManyToManyField(to='site_prj.Author')),

            ],

        ),

        migrations.CreateModel(

            name='Person2',

            fields=[

                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

                ('name', models.CharField(max_length=40)),

                ('age', models.IntegerField()),

            ],

        ),

        migrations.CreateModel(

            name='Publisher',

            fields=[

                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

                ('name', models.CharField(max_length=30)),

                ('address', models.CharField(max_length=50)),

                ('city', models.CharField(max_length=60)),

                ('state_province', models.CharField(max_length=30)),

                ('country', models.CharField(max_length=50)),

                ('website', models.URLField()),

            ],

        ),

        migrations.AddField(

            model_name='book',

            name='publisher',

            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='site_prj.Publisher'),

        ),

    ]
 
当定义了类型后,后面有需求有添加该如何处理呢。比如我们在出版商Publisher这个模型下面添加一个字段成立日期:
setup_date=models.DateField()
此时添加后,需要同步。在终端上执行python manage.py makemigrationsz首先进行迁移:出现如下提示。意思是这个变量没有一个默认值,选择1表示自行添加一个默认值

 
此时会进行python界面,输入值后退出。我选择的是timezone.now表示当前时间

再执行python manage.py migrate 进行迁移。如下所示,表示更新成功


此时在migrations文件夹下面会出现0002_publisher_setup_date.py文件


进入文件的代码如下:可以看到新添加了models.DateField字段并且赋了初始值
class Migration(migrations.Migration):



    dependencies = [

        ('site_prj', '0001_initial'),

    ]



    operations = [

        migrations.AddField(

            model_name='publisher',

            name='setup_date',

            field=models.DateField(default=django.utils.timezone.now),

            preserve_default=False,

        ),

    ]

至此,模型的建立以及更新就已经介绍完了,下面将讲下如何使用这些模型

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿与代码

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值