57.表关系一对多使用详解

1.应用场景:比如一个文章的分类中可以含有多篇文章 ,但是一篇文章只能属于一个分类,这就是典型的一对多关系。
2.实现方式 :一对多或者是多对一,都是通过“ForeignKey”来实现的,在这里以文章和分类的案例进行讲解。
articleAPP中models.py中定义模型,示例代码如下:
from django.db import models

class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    #  可以指定默认值,同样也可以指定null=True,因为默认情况下,null=False
    # 可以修改models.name_set名字,通过Foreign_key()中的属性,related_name
    author = models.ForeignKey('frontuser.User', on_delete=models.CASCADE, default=1)
    # 应用不同app中定义的模型,可以通过指定‘app名.模型名’
    category = models.ForeignKey('frontuser.Category', on_delete=models.CASCADE, default=1, related_name='articles')

    def __str__(self):
        return "<(Article: (id: %s, title: %s, content: %s, author: %s, category: %s))>" %                (self.id, self.title, self.content, self.author, self.category)
frontuserAPP中models.py文件中示例代码如下:
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=20, default=1)
# 重写类的__str__(str)方法,在调用类的时候就会执行__str__(self)方法。
    def __str__(self):
        return "<(User: (id: %s, name: %s))>" % (self.id, self.name)

class Category(models.Model):
    name = models.CharField(max_length=100, default=1)
# 重写类的__str__(self)方法
    def __str__(self):
        return "<(Category: (id: %s, name: %s))>" % (self.id, self.name)
在article中的views.py文件中,示例代码如下:
from django.shortcuts import render
from django.http import HttpResponse
from .models import Article
from frontuser.models import User,Category

def index(request):
    # 添加用户数据信息
    # user = User(name='小蚂蚁')
    # user.save()
    #
    # # 2.category数据信息添加
    # category = Category(name='国际新闻')
    # category.save()
    #
    # # 3.article信息添加
    # article = Article(title='美国大选', content='女士们,先生们..')
    # article.save()
    return HttpResponse("success")

def one_to_many(request):
    # 1.添加一条数据,表与表之间的关系一对多
    # article = Article(title='习大大慰问', content='同志们好')
    # user = User.objects.first()
    # category = Category.objects.first()
    #
    # article.author = user
    # article.category = category
    # article.save()

    # 2.修改文章信息
    # article = Article.objects.get(title='美国大选')
    # category = Category.objects.get(name='国际新闻')
    # article.category = category
    # article.save()

    # 3.查找某个分类下所有的文章
    # 如果一个模型被其他的模型进行引用了,就会为这个模型添加一个方法为:
    # 被引用模型名小写字母_set,这个方法的使用和objects方法很相似
    # category = Category.objects.first()
    # # 得出的信息为RelateManager
    # article = category.article_set.first()
    # #  重写所有模型的__str__(self)方法
    # print(article)

    # 4.通过另外一种方法,将某一篇文章添加到某个分类中
    # 同样,被引用的模型下的models.name_set方法可以被重新定义为一个新的名字
    # 在模型中的ForeignKey()中有一个参数为 related_name,可以通过这个参数来更改
    # category = Category.objects.first()
    # article = Article(title='阿里巴巴', content='扫福活动')
    # article.author = User.objects.first()
    # article.save()
    #
    # # 将文章添加到分类中
    # category.articles.add(article)
    # category.save()

    # 5.在我们的对象还没有 保存,我们可以通过指定bluk=False,来让Django底层去保存
    # 再添加一篇文章,示例
    category = Category.objects.get(pk=3)
    article = Article(title='特朗普今日活动', content='保镖...')
    article.author = User.objects.get(pk=3)
    category.articles.add(article, bulk=False)
    return HttpResponse("添加成功")

*使用“bulk=False”,那么Django就会自动保存article,而不需要在添加到category之前 先保存article。或者是另外一种解决方式是,在添加到"category.article_set"中之前,先将“article”保存到数据库中,但是此时如果 “article.category”不能为空,那么就会产生一种死循环了,即article没有 "category"不能进行保存,而将article添加到"category.article_set"中,有需要article之前是已经存储到数据库中的。
查看数据库中article表中的数据信息:

原文地址:https://www.cnblogs.com/guyan-2020/p/12230504.html

时间: 2024-10-08 20:16:33

57.表关系一对多使用详解的相关文章

JavaScript表单序列化的方法详解

本文介绍下,在javascript中实现表单序列化的方法,通过实例加深理解,有需要的朋友参考下吧. 在JavaScript中,可以利用表单字段的type属性,连同name和value属性一起实现对表单的序列. 首先,我们来了解下在表单提交期间,浏览器是怎样将数据发送给服务器的.对表单字段的名称和值进行URL编码,使用和号(&)分割.不发送禁用的表单字段.只发送勾选的复选框和单选按钮.不发送type为"reset"和"button"的按钮.多选择框中的每个选中

Oracle创建表语句(Create table)语法详解及示例

Oracle创建表语句(Create table)语法详解及示例   创建表(Create table)语法详解1. ORACLE常用的字段类型ORACLE常用的字段类型有VARCHAR2 (size) 可变长度的字符串, 必须规定长度CHAR(size) 固定长度的字符串, 不规定长度默认值为1NUMBER(p,s) 数字型p是位数总长度, s是小数的长度, 可存负数最长38位. 不够位时会四舍五入.DATE 日期和时间类型LOB 超长字符, 最大可达4GCLOB 超长文本字符串BLOB 超长

Oracle 10g创建表空间的完整步骤详解

本文我们主要介绍了Oracle 10g创建表空间的完整步骤,包括表空间的创建与删除.为应用创建用户以及权限的授予等操作,希望能够对您有所帮助. AD:WOT2014:用户标签系统与用户数据化运营培训专场 Oracle 10g数据库中,当在数据库中创建用户时,基于应用性能和管理方面的考虑,最好为不同的用户创建独立的表空间. 那么创建表空间的步骤是怎样实现的呢?本文我们主要就介绍了这一部分内容,接下来就让我们一起来了解一下这部分内容吧. 1.创建表空间 不论是Lnux环境,还是Wndows环境,都要

正则表达式表单验证实例代码详解

正则表达式表单验证实例代码详解 这篇文章主要介绍了正则表达式表单验证实例详解的相关资料,大家可以参考下.正则表达式表单验证具体内容如下: 首先给大家解释一些符号相关的意义 * 匹配前面的子表达式零次或多次: ^ 匹配输入字符串的开始位置:$匹配输入字符串的结束位置 1. /^$/ 这个是个通用的格式. 2. 里面输入需要实现的功能. \d 匹配一个数字字符,等价于[0-9] + 匹配前面的子表达式一次或多次: ?匹配前面的子表达式零次或一次: 下面通过一段代码给大家分析表单验证正则表达式,具体代

boboJquery表单插件ajaxForm用法详解

插件主要的方法: ajaxFormajaxSubmitformToArrayformSerialize fieldSerializefieldValueclearFormclearFieldsresetForm 示例代码: 1 // wait for the DOM to be loaded 2 $(document).ready(function() {  3    // bind 'myForm' and provide a simple callback function   4    $

多表关系一对多和多对多

多表关系一对多和多对多 一.一对多 创建数据 一对多:外键必须放在多的一方,此时外键值不唯一 # 出版社(publish): id,name,address,phone create table publish( id int primary key auto_increment, name varchar(64), address varchar(256), phone char(20) ); # 书(book):id,name,price,publish_id, author_id crea

MySQL表名、列名区分大小写详解

前言:出现的问题 在本地数据库上执行修改银行卡没有报错 但线上执行报错 发现是表找不到,发现表名不对应该是card_cardinfo,但本地上没有问题,能正常修改,然后在数据库里测试,发现本地库(win)下表名不区分大小写,线上(linux)区分 在刚开始使用mysql的时候,刚开始是想要区分列名大小写的问题,在网上看到很多办法,于是就 1. linux下mysql安装完后是默认:区分表名的大小写,不区分列名的大小写:   2. 2.用root帐号登录后,在/etc/my.cnf中的[mysql

Mysql建表与索引使用规范详解

一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. 四. MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比. 五. MySQL使用时,一条SQL语句只能使用一个表的一个索引.所有的字段类型都可以索引,多列索引的属性最多15个. 六. 如果可以在多个索引中进行选择,My

关于JS面向对象中原型和原型链以及他们之间的关系及this的详解

一:原型和原型对象: 1.函数的原型prototype:函数才有prototype,prototype是一个对象,指向了当前构造函数的引用地址. 2.函数的原型对象__proto__:所有对象都有__proto__属性, 当用构造函数实例化(new)一个对象时,会将新对象的__proto__属性指向 构造函数的prototype. 1 zhangsan.__proto__==Person.prototype 注:在上述代码中Person是构造函数,zhangsan则是该构造函数的一个实例化对象.