Django一对多外键及一对一外键

在Django提供了三种models类型进行模型之间的关系链接,分别是:

一对一外键如:models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile');

一对多外键如:project = models.ForeignKey(WeldingProject, on_delete=models.CASCADE, verbose_name="焊接项目");

多对多外键如:wending_card = models.ManyToManyField(WeldingProcessCard, blank=True, null=True, verbose_name="使用了此焊材的焊接工艺卡")

一对一外键

一对一外键提供了model的拓展性,能够在不改变原model的情况下扩展内容,示例如下:

class User(models.Model):
	first_name = models.CharField(max_length=20, blank=True)
	last_name = models.CharField(max_length=20, blank=True)
	...
	
	def __str__:
		return xxx
		
class Profile(models.Model):
	# 外键定义在拓展model中
	user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') # 可通过related_name进行索引
	phone = models.CharField(max_length=20, blank=True)
	
	def __str__:
		return phone

在任何时候(views、template),都可以通过related_name的值将拓展内容当作参数进行访问,在以上示例中可以这样调用:user.profile.phone

一对多外键

一对多外键的典型应用如下:

class Belong_To_Class(models.Model):
    class_room = models.CharField(max_length=10)
class Student(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    belong_to_class = models.ForeignKey(Belong_To_Class, on_delete=models.DO_NOTHING)

在views中通过主题调用附属model时,可使用如下方式查询Class所有对应的Student:

Class = Belong_To_Class.objects.filter(pk=1)
Class[0].student_set.all()

在template中,可通过for循环遍历下属model,如:{% for student in class.student_set.all %}{% endfor %} 无需特意通过views的context传递值。

多对多外键

多对多外键不同意其它两种方式,一对一及一对多大多都是使用数据库的外键进行实现,多对多外键是创建第三个table用于储存对应的键值对。故多对多外键的定义不局限于其中某一个model,设置键值对的方式也有所不同,具体引用方式暂时未知,估计和一对多类似,暂时留坑,等后续用上了再看。



登录后回复

共有0条评论

目 录