Python-web之Django項目連接已存在的mysql數據庫

在django開發過程中,需要從自己的mysql數據庫中讀取數據並展示,由於表格是存在的,不需要像其他django項目一樣在數據庫中創建專門的表格,大致過程如下

1. 設置setting中的database信息

# setting.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': '<你的mysql數據庫名>',
        'USER': '<mysql用戶名>',
        'PASSWORD': '<mysql密碼>',
        'HOST': '127.0.0.1',
        'PORT': 3306
    }
}

2.反向生成models.py

利用django的inspectdb,django通過setting當中的database配置信息找到數據庫表,並輸出到默認輸出設備

python .\manage.py inspectdb

輸出大致如下,不同項目以及表格輸出會有所區別,但是形式基本一樣

# This is an auto-generated Django model module.
# You'll have to do the following manually to clean this up:
#   * Rearrange models' order
#   * Make sure each model has one field with primary_key=True
#   * Make sure each ForeignKey has `on_delete` set to the desired behavior.
#   * Remove `managed = False` lines if you wish to allow Django to create, modify, and delete the table
# Feel free to rename the models, but don't rename db_table values or field names.
from __future__ import unicode_literals

from django.db import models

class Riderecords(models.Model):
    rider = models.CharField(db_column='Rider', max_length=32)  # Field name made lowercase.
    trainnum = models.CharField(db_column='TrainNum', max_length=128)  # Field name made lowercase.
    seatnum = models.CharField(db_column='SeatNum', max_length=16)  # Field name made lowercase.

    class Meta:
        managed = False
        db_table = 'Riderecords'

class AuthGroup(models.Model):
    name = models.CharField(unique=True, max_length=80)

    class Meta:
        managed = False
        db_table = 'auth_group'

class AuthUser(models.Model):
    password = models.CharField(max_length=128)
    last_login = models.DateTimeField(blank=True, null=True)
    is_superuser = models.IntegerField()
    username = models.CharField(unique=True, max_length=150)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    email = models.CharField(max_length=254)
    is_staff = models.IntegerField()
    is_active = models.IntegerField()
    date_joined = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'auth_user'


class AuthUserGroups(models.Model):
    user = models.ForeignKey(AuthUser, models.DO_NOTHING)
    group = models.ForeignKey(AuthGroup, models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'auth_user_groups'
        unique_together = (('user', 'group'),)


class DjangoSession(models.Model):
    session_key = models.CharField(primary_key=True, max_length=40)
    session_data = models.TextField()
    expire_date = models.DateTimeField()

    class Meta:
        managed = False
        db_table = 'django_session'

直接拷貝到models.py文件中去

3.將改動應用到數據庫表

執行兩個命令

python manage.py makemigrations
python manage.py migrate

 

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------

到這步基本大多數人都可以解決自己的問題了,但是我的情況又比較複雜,可以看到我上面的models裏的表格語言中,我的表格是沒有主鍵之類的字段的,而django項目會默認給你的表格一個id字段,用於標記每條記錄,網上說的內容大致是去掉那一行就行了,然而我的輸出內容中,並沒有被自動添加id字段,沒得刪,然而在編寫views過程中,使用

models.Personinfo.objects.all()

獲得的內容傳遞給html前端之後,獲取內容的時候總是會報錯,找不到id這個字段,一臉懵啊,表格中也沒有這個字段,models中也沒有添加這個字段,但是通過objects.all()方式獲得的內容,總是會出現這個問題,只能換一種方式

models.Personinfo.objects.values_list('name', 'sex', 'age')

利用values_list()方法傳遞所有字段名來獲取,勉強算是解決了這個問題

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章