ForeignKey(to, on_delete, related_name=None, related_query_name=None, limit_choices_to=None, parent_link=False, to_field=None, db_constraint=True, **kwargs)
to : 要关联的表名。
on_delete : 当删除关联表中的数据时,当前表与其关联的行的行为。
related_name : 用于反向操作时,代替表名_set,即 related_name == 表名_set。
to_field : 表示需要关联的表的字段, 默认情况下会关联表的主键。
related_query_name : 用于反向操作时,代替表名 即 表名_set == related_query_name_set。也可用于连表查询。
db_constraint : 表示是否在数据库中创建外建约束。
limit_choices_to: 在Admin或ModelForm中显示关联数据时,提供的条件。
parent_link: 在Admin中是否显示关联数据。(不常用)
OneToOneField(to, on_delete, related_name=None, related_query_name=None, limit_choices_to=None, parent_link=False, to_field=None, db_constraint=True, **kwargs)
to : 要关联的表名。
on_delete : 当删除关联表中的数据时,当前表与其关联的行的行为。
related_name : 用于反向操作时,代替表名_set,即 related_name == 表名_set。
to_field : 表示需要关联的表的字段, 默认情况下会关联表的主键。
related_query_name : 用于反向操作时,代替表名 即 表名_set == related_query_name_set。也可用于连表查询
db_constraint : 表示是否在数据库中创建外建约束。
limit_choices_to: 在Admin或ModelForm中显示关联数据时,提供的条件。
parent_link: 在Admin中是否显示关联数据。(不常用)
ManyToManyField(to, related_name=None, related_query_name=None, limit_choices_to=None, symmetrical=None, through=None, through_fields=None, db_constraint=True, db_table=None, swappable=True, **kwargs)
注意:在多对多关系中,django默认会创建第三个表,来存储对应表的关系。你也可以通过through来指定存放映射关系的表。
symmetrical: 仅用于多对多自关联时,指定内部是否创建反向操作的字段。默认为True。
through:手动指定中间关联表。(需要在models.py中创建一个Model,并且其中包含两个相关联模型的外键)
through_fields:在中间表中,有多个关联对象的外建。django需要知道使用哪两个关联,through_fields = (field1,field2),注意field1应该是有ManyToManyField字段的关联模型外键名。
db_constraint:是否在数据库中创建外建约束
db_table:指定表名
from django.db import models # Create your models here. class UserInfo(models.Model): username = models.CharField(max_length=16,unique=True,null=True) pwd = models.CharField(max_length=32,null=True) addresss = models.CharField(max_length=32,default='sdaf') signup_time = models.DateField(auto_now_add=True) class OrderInfo(models.Model): order_time = models.DateField(auto_now_add=True) order_status = models.BooleanField() order_content = models.CharField(max_length=32) key = models.ForeignKey(UserInfo, on_delete=models.CASCADE, default=1, related_name='Info',related_query_name='query') class UserSalary(models.Model): money = models.IntegerField() user = models.ManyToManyField(UserInfo, related_name='salary') class UserAge(models.Model): age = models.IntegerField() user_age = models.OneToOneField(UserInfo,on_delete=models.CASCADE)
一共有五张表。
OneToOne(一对一的增删改查)
- 查
a = UserAge.objects.get(id=1) d = UserInfo.objects.get(id=1) # 也可以使用filter,但是注意filter查出的是QuerySet集合。 a.age # 12 d.username # xiao1 # 正向查 a.user_age.username # 'xiao1' # 反向查 注意这个和多对一和多对多不一样。一个对象只对一个对象。 d.userage.age # 12 #注意反向查的时候,不需要在model名后加set
- 删
# 直接删 a.delete() # 或者 d.userage.delete() # 两个表达式都返回值 (1, {'myapp.UserAge': 1})
- 增
# 先在主表中新建一个对象(或者查找一个对象,注意这个对象不能是已关联过的) # e = UserInfo.objects.get(id=4) e = UserInfo.objects.create(username = 'first') # 然后创建从表对象,将要关联的主表对象赋值给从表中的OneToOne字段。 UserAge.objects.create(age=121,user_age=e)
- 改
# 在主表或者从表中随便修改。然后用save()保存 a.age = 122 a.save() d.username = "zhangzhang" d.save() # get()出的数据不是quertset,因此不可以使用update方法。如果想要用的话,可以使用filter查
查
正向操作和反向操作
注意:正反向操作时,起始必须是model中一个对象,不可以是QuerySet集合。
# 正向操作(根据从表查主表中数据) OrderInfo.objects.get(id=1).key.username # 反向操作(根据主表中数据查从表中数据) UserInfo.objects.get(id=1).Info.all() # 注意:由于设置了related_name , 所以上面语句中 Info == orderinfo_set # 正向操作时,对于ForeignKey,由于查到的是一个对象,因此无法使用.all()方法。
增
常用的是add和create方法。
add
(*objs, bulk=True, through_defaults=None) # 将指定的模型对象添加到关联对象集合中。a = OrderInfo.objects.get(id=2) UserInfo.objects.get(id=3).Info.add(a) # related_name为Info
add中可以是多个对象,也可以是关联对象主键值
# 多个对象 >>> lists = OrderInfo.objects.filter(order_status=0) >>> UserInfo.objects.get(id=4).Info.add(*lists)
create
(through_defaults=None, **kwargs)创建一个新对象,保存并将其放入相关对象集中。返回新创建的对象.
# 一般都是从主表出发, UserInfo.objects.get(id=3).Info.create(order_status=1,order_content="success")
也就相当于
u = UserInfo.objects.get(id=3) o = OrderInfo(order_status=1,order_content="success",key=u) o.save()
删
remove
(*objs, bulk=True)从相关对象集中删除指定的模型对象:(这也是从主表出发)
>>> b = Blog.objects.get(id=1) #主表对象 >>> e = Entry.objects.get(id=234) # 从表对象 >>> b.entry_set.remove(e) # Disassociates Entry e from Blog b.
#注意,对于ForeignKey,必须要外建字段选项null=True,才可以使用remove方法,否则不行。ManyToMany无所谓
# 除此以外,删除操作后,只是把存放映射关系的第三张表的中的数据删除了。并没有删除从表中的数据。
clear
(bulk=True)#注意,对于ForeignKey,必须要外建字段选项null=True,才可以使用clear方法,否则不行。ManyToMany无所谓
>>> b = Blog.objects.get(id=1) >>> b.entry_set.clear()
改
set()方法
set
(objs, bulk=True, clear=False, through_defaults=None)重置关联关系。
该方法有一个clear 参数。如果clear=False ,则将不再objes 中的元素使用remove()方法移除。如果clear=True,则首先调用clear()方法将之前的元素全部删除掉,再将集合中的元素整个删除。
最重要的是 :对于多对多,如果你使用了中间模型(保存多对多的关系),则add,create,remove,set方法都不能调用。