一、在同一个app
下的模型使用外键关联
-
1、文章分类数据模型
class CategoryModel(models.Model): """ 文章分类 """ name = models.CharField(max_length=100, verbose_name='文章分类') def __str__(self): return '<CategoryModel>({})'.format(self.name) class Meta(object): db_table = 'category'
-
2、文章的数据模型
class ArticleModel(models.Model): """ 文章的模型 """ title = models.CharField(max_length=100, verbose_name='文章标题') content = models.TextField(verbose_name='文章内容') create_time = models.DateTimeField(auto_now_add=True, verbose_name='文章创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='修改时间') # 创建一个外键关联 category = models.ForeignKey('Category', on_delete=models.CASCADE, verbose_name='文章分类') class Meta(object): db_table = 'article' def __str__(self): return '<ArticleModel>({}, {})'.format(self.title, self.create_time)
-
3、映射到数据库
# [app名]表示可以写上app名字也可以不写,如果不写就会映射生成全部app的表,如果写了只会生成当前的app的数据表 python manage.py makemigrations [article] python manage.py migrate [article]
-
4、关于添加数据的示例代码
注意要先添加分类数据模型的数据
class ArticleView(View):
"""
文章的视图类
"""
def get(self, request, *args, **kwargs):
# 添加分类
# models.CategoryModel.objects.create(name='java开发')
# models.CategoryModel.objects.create(name='python开发')
# models.CategoryModel.objects.create(name='web开发')
# 通过添加对象的方式添加数据
models.ArticleModel.objects.create(title='文章一', content='文章一的内存',
category=models.CategoryModel.objects.get(pk=1))
# 通过添加id的方式添加
models.ArticleModel.objects.create(title='文章二', content='文章二的内容',
category_id=models.CategoryModel.objects.all().first().id)
return render(request, 'article.html')
二、使用别的app
下的数据模型的写法
-
1、用户表的数据模型(属于
front
的app
)class FrontAccountModel(models.Model): """ 前端用户数据模型 """ account = models.CharField(max_length=30, unique=True, verbose_name='用户名') password = models.CharField(max_length=30, verbose_name='用户密码') def __str__(self): return '<FrontUserModel>({},{})'.format(self.account, self.password) class Meta(object): db_table = 'front_account'
-
2、文章数据模型关联到用户表模型
class ArticleModel(models.Model): """ 文章的模型 """ title = models.CharField(max_length=100, verbose_name='文章标题') content = models.TextField(verbose_name='文章内容') # 创建一个外键关联 category = models.ForeignKey('CategoryModel', on_delete=models.CASCADE, verbose_name='文章分类') # 关联到别的数据模型的字段: app名字.数据模型 author = models.ForeignKey('front.FrontAccountModel', on_delete=models.CASCADE, verbose_name='文章作者') class Meta(object): db_table = 'article' def __str__(self): return '<ArticleModel>({}, {})'.format(self.title, self.content)
-
3、映射到数据库
-
4、添加数据
from django.shortcuts import render from django.views import View from . import models from front.models import FrontAccountModel class ArticleView(View): """ 文章的视图类 """ def get(self, request, *args, **kwargs): # models.CategoryModel.objects.create(name='java开发') # models.CategoryModel.objects.create(name='python开发') # models.CategoryModel.objects.create(name='web开发') # 通过添加对象的方式添加数据 models.ArticleModel.objects.create(title='文章一', content='文章一的内存', category=models.CategoryModel.objects.get(pk=1), author=FrontAccountModel.objects.first()) # 通过添加id的方式添加 models.ArticleModel.objects.create(title='文章二', content='文章二的内容', category_id=models.CategoryModel.objects.all().first().id, author_id=FrontAccountModel.objects.get(pk=1).id) return render(request, 'article.html')
三、同表自关联的外键(比如评论回复需要指定回复的是哪个评论)
-
1、创建一个
message
的app
-
2、创建数据模型
class MessageModel(models.Model): """ 评论数据模型 """ content = models.TextField(verbose_name='评论') origin_content = models.ForeignKey('self', on_delete=models.CASCADE, null=True, verbose_name='评论') class Meta(object): db_table = 'message' def __str__(self): return '<MessageModel>({},{})'.format(self.content, self.origin_content)
-
3、添加数据
class MessageView(View): """ 评论的视图 """ def get(self, request, *args, **kwargs): # models.MessageModel.objects.create(content='评论一') models.MessageModel.objects.create(content='评论11', origin_content=models.MessageModel.objects.get(pk=1)) return HttpResponse('评论')
-
4、查询数据
class MessageView(View): """ 评论的视图 """ def get(self, request, *args, **kwargs): message_result = models.MessageModel.objects.all().last() print(message_result) print(message_result.origin_content) print(message_result.origin_content_id) return HttpResponse('评论')
四、关于django
中外键的删除(on_delete
)
- 1、
CASCADE
:这就是默认的选项,级联删除。 - 2、
PROTECT
: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError
错误。 - 3、
SET_NULL
: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True
,null=True,
定义该字段的时候,允许为空。 - 4、
SET_DEFAULT
: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。 - 5、
SET()
: 自定义一个值,该值当然只能是对应的实体了。