Django ORM 多对多关系创建 - downtiser/python-one GitHub Wiki

Django创建多对多外键关系表

  • 方法1:自定义多对多关系
class Many_to_many(models.Model):
    f1 = models.ForeignKey(to='Table1', to_field='id')
    f2 = models.ForeignKey(to='Table2', to_field='id')
  • 方法2:利用Django自动创建多对多关系
class Table1(models.Model):
    t1 = models.charField(max_length=32)
class Table2(models.Model):
    t2 = models.CharField(max_length=64)
    f_key = models.ManyToManyField(to='Table1') #创建表时Django会自动创建第三张表来维护多对多关系,表名为Table2_f_key
  • 方法一更好一些,可以自己定制第三张表, 方法二无法直接操作第三张表
  • 方法二操作第三张表:
  • 添加记录:
obj = models.Table2.objects.get(id=1) # 确定记录的Table2_id一列的值为1
obj.f_key.add(2) # 表示往第三张表中添加一条记录,关联Table2的id为1和Table1的id为2的记录
obj.f_key.add(*[1, 2, 3, 4]) # 表示添加 1-1, 1-2, 1-3, 1-4这样的四条记录
  • 删除记录:
obj.f_key.remove(2) # 表示移除1-2这样的一条记录
obj.f_key.remove(*[1,2,3,4]) # 表示移除类似的四条记录
obj.f_key.clear() # 表示清除所有和这个对象相关联的记录
  • 修改记录:obj.f_key.set([3,5,7]) # 表示将跟1有关的记录替换为1-3, 1-5, 1-7, 数据库中和1有关的记录只剩下这些
  • 获取记录:obj.f_key.all() obj.f_key.filter() obj.f_key.filter()f.irst(), 注意,拿到的都是与之关联的表的对象,而不是第三张表的对象