1.一对多的问题
1.1 一个用户和他的访问记录就是一个一对多的关系,一对多只需要在多的那个表写语句即可
class Record(models.Model):
"""浏览记录"""
recordid = models.BigAutoField(primary_key=True)
# 一对多 ,在多的一方写ForeignKey语句,to表示对应的表,on_delete是否关联删除,db_column表示数据库中对应的列
user = models.ForeignKey(to=User, on_delete=models.PROTECT, db_column='userid')
recorddate = models.DateTimeField(auto_now=True)
class Meta:
managed = False
db_table = 'tb_record'
1.2 一对多中的一个特例(自参照)。列如省份和市和区都属于地区。区和市,市和省都属于多对一的关系。
class District(models.Model):
"""地区"""
distid = models.IntegerField(primary_key=True)
parent = models.ForeignKey(to='self', on_delete=models.PROTECT, db_column='pid', blank=True, null=True)
name = models.CharField(max_length=255)
ishot = models.BooleanField(default=False)
intro = models.CharField(max_length=255, blank=True, null=True)
def __str__(self):
return self.name
class Meta:
managed = False
db_table = 'tb_district'
2.对多对的问题
比如现在我们有一个用户表和一个角色表,用户和角色是多对多的关系,那么我们就需要一个中间表用户角色表来将她们关联起来:
class User(models.Model):
"""用户表"""
userid = models.AutoField(primary_key=True)
username = models.CharField(unique=True, max_length=20)
password = models.CharField(max_length=32)
# ManyToManyField to表示关联哪张表,through则对应中间表
roles = models.ManyToManyField(to='Role', through='UserRole')
class Meta:
managed = False
db_table = 'tb_user'
class Role(models.Model):
"""角色表"""
roleid = models.AutoField(primary_key=True)
rolename = models.CharField(max_length=255)
def __str__(self):
return self.rolename
class Meta:
managed = False
db_table = 'tb_role'
class UserRole(models.Model):
"""用户角色中间实体"""
urid = models.AutoField(primary_key=True)
user = models.ForeignKey(to=User, on_delete=models.PROTECT, db_column='userid')
role = models.ForeignKey(to=Role, on_delete=models.PROTECT, db_column='roleid')
class Meta:
managed = False
db_table = 'tb_user_role'
# 唯一约束,user可以有多个,role也可以有多个,但一个用户对应的一个user只能有一个
unique_together = (('user', 'role'), )
3. 一对一问题
class UserToken(models.Model):
"""用户身份令牌"""
tokenid = models.AutoField(primary_key=True)
token = models.CharField(max_length=32)
user = models.OneToOneField(to=User, on_delete=models.PROTECT, db_column='userid')
class Meta:
managed = False
db_table = 'tb_user_token'