django_多表查询

一、一对多

  • 利用ForeignKey 创建表

注关联表中会自动添加字段后面加_id,相当于publish _id,其中单独的publish包含整个Publish对象

class Book(models.Model):
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    pud_data = models.DateField()
    publish = models.ForeignKey('Publish')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
  • 第一种方法通过真实的字段,也就是在_id添加
def index(request):
    from cm import models
    obj = models.Book.objects.create(
        name = "c#",
        price = 200,
        pud_data = '2008-08-08',
        publish_id= 1
    )
    print(obj)
    return  HttpResponse('ok')
  • 第二种通过对象添加,具体的操作是先查找出关联对象,把关联对象直接赋值給属性
  • 正向查找通过对象包含查找
def index(request):
    from cm import models
    obj = models.Book.objects.filter(name="python")
    print(obj[0].publish.city)
    return  HttpResponse('ok')
  • 反向查找,通过关联对象查找
  • 第一种通过对象反差
def index(request):
    from cm import models
    obj = models.Publish.objects.filter(name="理工")[0]
    obj1 = models.Book.objects.filter(publish=obj).values("name")
    print(obj1)
    return  HttpResponse('ok')
  • 第二种通过set反查,通过关联的类后面加_set
def index(request):
    from cm import models
    obj = models.Publish.objects.filter(name="理工")[0]
    obj1 = obj.book_set.all()
    print(obj1)
    return  HttpResponse('ok')
  • 第三种直接属性双下滑下接字段,例如publish__name
def index(request):
    from cm import models
    obj = models.Book.objects.filter(publish__name="理工").values("name")
    print(obj)
    return  HttpResponse('ok')

二、多对多

  • 利用ManyToManyField创建表
class Book(models.Model):
    name = models.CharField(max_length=20)
    price = models.IntegerField()
    pud_data = models.DateField()
    authors = models.ManyToManyField('Author')

class Author(models.Model):
    name = models.CharField(max_length=32)

利用查询包含ManyToManyField对象,进行查找关联表

def index(request):
    from cm import models
    obj = models.Book.objects.filter(name="go")
    print(obj[0].authors.all().values('name'))
    return  HttpResponse('ok')
  • 增加add,先找到关联对象,在有add添加对象
def index(request):
    from cm import models
    obj = models.Author.objects.all()
    obj1 = models.Book.objects.filter(name="python")
    obj1[0].authors.add(*obj)
    return  HttpResponse('ok')
  • 或者直接添加主键
def index(request):
    from cm import models
    obj = [1,2]
    obj1 = models.Book.objects.filter(name="python")
    obj1[0].authors.add(*obj)
    return  HttpResponse('ok')
  • remove删除
def index(request):
    from cm import models
    obj = [1,]
    obj1 = models.Book.objects.filter(name="python")
    obj1[0].authors.remove(*obj)
    return  HttpResponse('ok')
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容