view.py与models的交互(2)--一对多关系的增删改查

1.表结构

"# models.py"

> class Task(models.Model):
    class Meta:
        db_table = "task"

    person_res = models.ForeignKey('Res_person',on_delete=models.CASCADE,)
    co_person = models.ManyToManyField('Res_person', related_name='协同人')
    cpl_state = models.BooleanField(default=False)
    deadlines = models.DateField()
    sort = models.ForeignKey('Category',on_delete=models.CASCADE,)
    content = models.TextField()
    ...
    其它字段

> class Res_person(models.Model):
    class Meta:
        db_table = "res_person"

    name = models.CharField(max_length=12, null=False)
    pro_group = models.ForeignKey('Progroup',models.CASCADE)

    def __str__(self):
        return self.name

2.基本方法

# 以下是几种常用的方法
Task.objects.all() #获取所有task对象
Task.objects.filter(id=1) #获取第一项task
#创建表并为表中的项赋值
Task.objects.create(person_res_id= user_person, deadlines=user_deadline,)
which=Task.objects.get(id=which_task) #获取第which_task项任务(只能是一条)
which.co_person.count() #此项任务有多少个协同人
which.person_res.delete() #删掉此项任务的主负责人

3.特别说明

#html form表单  p.name 为任务的主负责人
  <input type="radio" name="res_person"  value="{{p.name}}">{{p.name}}

#view.py

# 从html中获取input 里value属性中的值;get里面是name不是id 
 user_person = request.POST.get('res_person')  
# 一定是要先获得person的对象之后再传入到Task里面
 person= Res_person.objects.get(name=user_person) 
# person作为Task的外键,因此传入的是person对象
 task = Task.objects.create(person_res= user_person, deadlines=user_deadline, sort=sort, content=user_task,)

4.django使用Q对象进行复杂查询

  • filter() 等方法中的关键字参数查询都是一起进行“AND” 的。 如果你需要执行更复杂的查询(例如OR 语句),可以使用Q 对象。Q 对象 (django.db.models.Q) 对象用于封装一组关键字参数。
  • from django.db.models import Q
  # 获取电气专业组
  pro_gup=Progroup.objects.get(pro_group = "电气专业组")

  # 筛选出电气组专业组的成员
  pro_persons = Res_person.objects.filter(pro_group = pro_gup)

 # 使用Q对象结合flier常用查询条件 筛选出电气专业组成员已完成的任务
  task_c = Task.objects.filter(Q(cpl_state=True) & Q(person_res__in=pro_persons)).order_by('deadlines')

5.Q 查询 filter 常用查询条件

  • 上段Q(person_res__in=pro_persons))就使用到了"_in"的查询方法,更多的查询方法如下:
__exact 精确等于 like 'aaa'
 __iexact 精确等于 忽略大小写 ilike 'aaa'
 __contains 包含 like '%aaa%'
 __icontains 包含 忽略大小写 ilike '%aaa%',但是对于sqlite来说,contains的作用效果等同于icontains。
__gt 大于
__gte 大于等于
__lt 小于
__lte 小于等于
__in 存在于一个list范围内
__range 在...范围内
__year 日期字段的年份
__month 日期字段的月份
__day 日期字段的日
__isnull=True/False
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。