在查询的时候,在filter和values中可以运用万能的双下划线”__”直接将子表或者主表的想查的所有对象拿过来,例如我想查由南方出版社出版的书的价格和名字,那么我们只要输入:
Book.objects.filter(publish__name=’南方出版社’).values(‘name’,’price’),
反之我们也可以查询三国演义这本书的出版社的地址:
Publish.objects.filter(book__name=’三国演义’).values(‘city’)
在values中使用双下划线的例子:
查找三国演义这本书的出版社的名字和地址
Book.objects.filter(name='三国演义').values('publish__name','publish__city')
首先先在Book表中定位到name=‘三国演义’,然后在values中直接调用外键关联的publish的表中的内容,双下划线直接调用了publish中的所有数值。这句话也可以用另一种方式写:
Publish.objects.filter(book__name=’三国演义’).values(‘name’,’city’)
Values里的数据是用来显示最后想要得到的数据,前面只是查询。
在django的models中一共有2中数据类型:queryset和object对象:
Object:一个object对象就是表中的一条数据,表中所有的字段它都有
Queryset查询集是一组数据的集合,跟python的list基本一样的
所以当我们在使用双下划线时,实际上是调用了QUERYSET查询集进行获取,**queryset__**可以获取所有的数据对象。和object.字段名的查询结果是一样的。
Object.id=queryset__id
在进行多对多表的ORM操作的时候,首先设置ManyToMany()
如果括号里的表名上面还没有定义,那么就不能直接使用要加引号。
在对多表进行操作时,实际上是在操作设置了ManyToMany
的这个字段名。
例如:定义了一个Student表,在表中t=ManyToMany(‘Teacher’)
,那么t就是Student的一个字段,一共有三种方式可以操作,增删改。
当然首先要获取一个对象,在这里要特别注意我们要获取的对象不能时Queryset对象,这就是说我们在那对象是不能只使用all和filter,在后面要加条件,不然会报错。
然后就是增加:obj.t.add()括号里填写要添加的老师表里的id号,可以是单个参数,2个参数,或者是列表。注意要加列表时,列表前要加*号。例如obj.t.add(*[1,2,3])
删:obj.t.remove()
用法和增加相同。
obj.t.clear()
删除所有
改:这里是一个新的方法obj.t.set()
,注意set方法的参数是一个列表,不用加*号,set的作用是将列表里有的id设置,其余全部清楚。