django数据操作总结

2021-05-10  本文已影响0人  HC2

模型:

from django.db import models

# Create your models here.

class Author(models.Model):
    id = models.AutoField(primary_key=True)  
    name = models.CharField(max_length=32) 
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')

class Book(models.Model):
    id = models.AutoField(primary_key=True)  # AutoField唯一主键
    user = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者')
    name = models.CharField(max_length=512)
    field = models.CharField(max_length=512)

一、往表中插入数据

模型:

class Member(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    members = models.ManyToManyField(Member,null=True)

1)、

s = Student.objects.get(id = 1)
s.members.add(1,2,3)

2)、

s = Student.objects.get(id = 1)
m = Member.objects.get(id=1)
m2 = Member.objects.get(id=2)
s.members.add(m,m2)

3)、批量添加

s = Student.objects.get(id = 1)
m = Member.objects.all()
s.members.add(*m)

4)、方向添加

s = Student.objects.all()
m = Member.objects.get(id=1)
m.student_set.add(*s)

二、修改表数据

当 Author.objects.get(id=1).update(name='曹雪芹3') 写法时会报错:AttributeError: 'Author' object has no attribute 'update'

方法二适合更新一批数据,类似于mysql语句update Author set name='曹雪芹' where id = 1

方法一适合更新一条数据,也只能更新一条数据

当表有字段具有auto_now属性且你希望他能自动更新时,必须使用上边方法一的更新,不然auto_now字段不会更新,如方法二 Author表的update_time不会被更新

使用方法二更新auto_now可使用一下方法进行更新

from datetime import datetime
obj = Author.objects.filter(id=1).update(name='曹雪芹3',update_time=datetime.now())

方法一

    data = {'name':'曹雪芹3','update_time':datetime.now()}
    obj = Author.objects.filter(id=1).update(**data)

方法二

    data = {'name':'曹雪芹3','update_time':datetime.now()}
    obj = Author.objects.get(id=1)
    obj.__dict__.update(**data)
    obj.save()

方法一

 User.objects.filter(id=1).update(role=2)

方法二

obj = Book.objects.filter(id=1).update(user_id=4)

方法三

author = Author.objects.get(id=1)
obj = Book.objects.filter(id=1).update(user=author)

方法四

_t = Book.objects.get(id=1)
_t.user=Author.objects.get(id=3)
_t.save()

模型:

class Member(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)


class Student(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    members = models.ManyToManyField(Member,null=True)

多对多没有直接更新的方法,只能通过清空再添加的方法更新了

一、删除单个

s = Student.objects.get(id = 1)
s.members.remove(1)
s.members.add(1)  #再添加

二、批量删除

s = Student.objects.get(id = 1)
s.members.remove(2,3)
s.members.add(2,3) #再添加

或者:

s = Student.objects.get(id = 1)
m = Member.objects.all()
s.members.remove(*m)
s.members.add(*m)  #再添加

三、删除表数据

1)、

b =  Book.objects.get(id=1)
b.delete()

2)、多对多清除关联关系

指定student清空member

s = Student.objects.get(id = 1)
m = Member.objects.all()
s.members.remove(*m)

或者

s = Student.objects.get(id = 1)
s.members.clear()

四、查询数据

不存在时返回为空

    b =  Book.objects.filter(id=1)
    print(b)
    <QuerySet []>

模型:

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间')
    groups = models.ManyToManyField(Group,null=True,verbose_name='用户分组')


class Book(models.Model):
    id = models.AutoField(primary_key=True)  # AutoField唯一主键
    user = models.ForeignKey(Author, on_delete=models.CASCADE, verbose_name='作者',related_name='books')
    name = models.CharField(max_length=512)
    field = models.CharField(max_length=512)

1)、查询书名为'红楼梦'的作者

b = Book.objects.get(name='红楼梦')
user = b.user
print(user.name)

2)、查询作者为'曹雪芹'的书

b = Book.objects.filter(user__name='曹雪芹')
print(b)

或者:

user = Author.objects.get(name='曹雪芹')
book = user.book_set.all()
print(book)

或者:

user = Author.objects.get(name='曹雪芹')
book = user.books.all()
print(book)

books为: related_name='books'的 books

查询出name='曹雪芹'外的数据

user = Author.objects.exclude(name='曹雪芹')
print(user)
上一篇下一篇

猜你喜欢

热点阅读