__str__ 和 __repr__ Django中的一对多(外键约束) 进阶版一对多
__repr__ 是内置数据类型打印时 ,调用 repr方法
一丶__str__
和 __repr__
class Publish(models.Model):
pname = models.CharField(max_length=32, unique=True)
paddr = models.CharField(max_length=32)
# 这是调用 __str__ 方法打印的结果, __str__是让程序员看的
# 打印'对象'时,先找__str__方法,如果没有__str__方法,才找__repr__方法,在没有就去父类去找
def __str__(self):
return f'{self.pname}***{self.paddr}'
#这是调用 __repr__ 方法打印的结果, __repr__是让程序看的
#打印python默认数据类型时,直接调用的是__repr__方法
# 内置数据对象,直接调用 __repr__方法
def __repr__(self):
return f'{self.pname}--{self.paddr}'
# 让__repr__ 和 __str__相等 ,一般来说使用str就足够了
__repr__=__str__
二丶Django中的一对多(外键约束)
在models.py文件下建立具有外键约束的表
from django.db import models
# '一'的一方:
class Publish(models.Model):
pname=models.CharField(max_length=32,unique=True)
paddr=models.CharField(max_length=32)
# '多'的一方:
class Book(models.Model):
bname=models.CharField(max_length=32,unique=True)
bprice=models.CharField(max_length=32)
pid=models.ForeignKey(to='Publish',on_delete=models.CASCADE) # 外键约束,
# 当执行完迁移命令时,pid字段在数据库中会是pid_id的存在
# 重点:
# 1. 数据库中的:pid_id是字段,对于类来说是属性. 可以直接放一个数值或其他类型的数据
# 2. 类中的pid字段则是一个对象,是关联外键的对象.使用时必须存放一个对象
# 参数说明:
to: # 关联外键的那张表,也就是类名
on_delete=None, # models.CASCADE 级联删除,
# models.SET(1) 将当前字段的值设置成1
# models.SET_DEFAULT 设置默认值, 需要设置default:default=11
# models.SET_NULL 设置为空,需要设置 : null=True
# models.DO_NOTHING 什么都不做,关联的数据删除后不影响当前字段的值
related_name=None, # 反向查询字段可以不用 表名小写,可以改名了
related_query_name=None,
limit_choices_to=None, # 限制关联字段的对象范围
parent_link=False,
to_field=None, # 被关联对象的用于关联的字段. 默认情况, Django 使用被关联对象的主键
db_constraint=True, # 这个就是保留跨表查询的便利(双下划线跨表查询```)
三丶进阶版一对多项目
说明:
# 两张表: 一张出版社表, 一张图书表
# 假设: 多本图书对应一个出版社, 图书表建立外键:如上建表👆
# 查图书表时,需要查看所属的出版社
# 添加图书时,需要查询所有的出版社,以下拉选择框的形式进行选择
# 更改时图书表需要,也需要查询所有的出版社,以下拉选择框的形式进行选择. 下拉框要有默认值(和数据库存在的数据一样)
# 删除,表设置了级联删除 on_delete=models.CASCADE, 删除出版社时,图书表中所对应的数据也一起被删除
查
#### 图书
def book_list(request):
all_books = models.Book.objects.all().order_by('pk')
return render(request, 'book_list.html', {'all_books': all_books})