django---一对多和多对多字段的操作训练

建表准备:

django项目models.py建表

from django.db import models

class Myclass(models.Model):
    cname = models.CharField(max_length=12)

class Student(models.Model):
    sname = models.CharField(max_length=12)
    myclass=models.ForeignKey(to='Myclass')
    def __str__(self):
        return self.sname

class Theacher(models.Model):
    tname = models.CharField(max_length=12)
    myclass = models.ManyToManyField(to='Myclass')
    def __str__(self):
        return self.tname
import os
import sys

if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day66.settings")
    import django
    django.setup()
    from app01.models import Student,Myclass,Theacher

    #、查询id=1的班级的所有的学生
        #方法1.1、先获取id=1的班级对象反向查找学生对象
    # print(Myclass.objects.get(id=1).student_set.all())
        # 方法1.2、根据queryset对象反向查找
    # print(Myclass.objects.filter(id=1).values('student__sname'))

        #方法2、学生对象正向查找班级id=1的学生
    # print(Student.objects.filter(myclass__id=1))


    #、查找id=2的班级的所有老师
        #反向查找基于queryset和对象查找
    # print(Myclass.objects.filter(id=2).values('theacher__tname'))
    # print(Myclass.objects.get(id=2).theacher_set.all())
    #     #正向查找
    # print(Theacher.objects.filter(myclass__id=2))

    #给id=2的班级添加一个id=6的学生,如果学生原本有班级则改成现在班级(学生只能对应一个班级)
    # print(Myclass.objects.get(id=2).student_set.add(Student.objects.get(id=6)))

    #把所有学生划到1班去
    # print(Myclass.objects.get(id=1).student_set.set(Student.objects.all()))




    #给id=2的老师添加一个班级
    # Theacher.objects.get(id=2).myclass.add(*[2,3])

    #把id=2的老师关联的1班清空解除关联关系
    # Theacher.objects.get(id=2).myclass.remove(1)

    # 把id=2的老师关联的班清空解除关联关系
    # Theacher.objects.get(id=2).myclass.clear()

    #id = 2的老师现在开设一新班级:PHP
    # Theacher.objects.get(id=2).myclass.create(cname='PHP')

    #类似方法2先创建课程然后绑定关系
    # Myclass.objects.create(cname='GO')
    # Theacher.objects.get(id=2).myclass.add(6)

    #给id=2的班级添加一个id=3的老师
    # Myclass.objects.get(id=2).theacher_set.add(3)
    #Myclass.objects.get(id=2).theacher_set.add(Theacher.objects.get(id=3))
    #多对多情况add可以直接写id或者对象,一对多的一的那方添加时只能写对象

总结:给一对多添加对象是时,调用者时是一时add只能添加对象,是多的一方是对象和id都可以

posted @ 2018-11-09 21:02  Kingfan  阅读(1008)  评论(0编辑  收藏  举报