day71_10_16多表断关联

---恢复内容开始---

本次环境:

  配置settings

INSTALLED_APPS = [
    # ...
    'rest_framework',
]

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'dg_proj',
        'USER': 'root',
        'PASSWORD': '123',
    }
}
"""
任何__init__文件
import pymysql
pymysql.install_as_MySQLdb()
"""

LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
USE_L10N = True
USE_TZ = False

MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
View Code

  配置路由:

#
from django.conf.urls import url, include
from django.contrib import admin
from django.views.static import serve
from django.conf import settings
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^api/', include('api.urls')),
    url(r'^media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
]

#
from django.conf.urls import url
from . import views
urlpatterns = [
    
]
View Code

一。基表。

  通常,当有一些属性所有的表都会用到时,可以创建一个基表用来被其他表继承,其中有一个abstract = True,代表这个表不会再数据库中生成对应的表:

class BaseModel(models.Model):
    is_delete = models.BooleanField(default=False)
    create_time = models.DateTimeField(auto_now_add=True)

    # 设置 abstract = True 来声明基表,作为基表的Model不能在数据库中形成对应的表
    class Meta:
        abstract = True

二。断关联多表关系。

  在表的设计中,如果出现环形的关联设计,这些表就永远不会被删除,所以可以通过逻辑上的关联实现表关联,而表中的关联不存在。

    publish = models.ForeignKey(
        to='Publish',
        related_name='books',
        db_constraint=False,
        on_delete=models.DO_NOTHING,
    )

  设计表时,relate_name代表的就是查询该字段时的名字。

  db_constraint表示这个外键是否有关联。

  on_delete就是代表关联的表在被删除后的动作。

  表设计:

"""
Book表:name、price、img、authors、publish、is_delete、create_time

Publish表:name、address、is_delete、create_time
    
Author表:name、age、is_delete、create_time

AuthorDetail表:mobile, author、is_delete、create_time
    
BaseModel基表
    is_delete、create_time
上面四表继承基表,可以继承两个字段
"""
"""
1、外键位置:
    一对多 - 外键放多的一方
    一对一 - 从逻辑正反向考虑,如作者表与作者详情表,
    作者删除级联删除详情,详情删除作者依旧存在,所以建议外键在详情表中 多对多 - 外键在关系表中 2、ORM正向方向连表查找: 正向:通过外键字段 eg: author_detial_obj.author 反向:通过related_name的值 eg:author_obj.detail 注:依赖代码见下方 3、连表操作关系: 1)作者删除,详情级联 - on_delete=models.CASCADE 2)作者删除,详情置空 - null=True, on_delete=models.SET_NULL 3)作者删除,详情重置 - default=0, on_delete=models.SET_DEFAULT 4)作者删除,详情不动 - on_delete=models.DO_NOTHING 注:拿作者与作者详情表举例 4、外键关联字段的参数 - 如何实现 断关联、目前表间操作关系、方向查询字段 i)作者详情表中的 author = models.OneToOneField( to='Author', related_name='detail', db_constraint=False, on_delete=models.CASCADE ) ii)图书表中的 publish = models.ForeignKey( to='Publish', related_name='books', db_constraint=False, on_delete=models.DO_NOTHING, ) authors = models.ManyToManyField( to='Author' related_name='books', db_constraint=False, ) 注:ManyToManyField不能设置on_delete,
  OneToOneField、ForeignKey必须设置on_delete
  (django1.x系统默认级联,但是django2.x必须手动明确)
"""

猜你喜欢

转载自www.cnblogs.com/LZXlzmmddtm/p/11695394.html