• 多对多字段四个方法


    创建表

    from django.db import models
    
    # Create your models here.
    """
    你在写orm语句的时候 跟你写sql语句一样
    不要想着一次性写完
    写一点查一点看一点
    """
    
    
    
    class Book(models.Model):
        title = models.CharField(max_length=32)
        price = models.DecimalField(max_digits=8,decimal_places=2)
        publish_date = models.DateField(auto_now_add=True)
    
        # 书籍与出版社 是一对多关系
        publish = models.ForeignKey(to='Publish')
        # 书籍与作者 是多对多
        authors = models.ManyToManyField(to='Author')
        """
        authors虚拟字段
            1.告诉orm自动帮你创建第三张关系表
            2.orm查询的时候  能够帮助你更加方便的查询
        """
    
        def __str__(self):
            return self.title
    
    
    class Publish(models.Model):
        name = models.CharField(max_length=32)
        addr = models.CharField(max_length=64)
    
        def __str__(self):
            return self.name
        """return返回的数据必须是字符串类型"""
    
    
    
    class Author(models.Model):
        name = models.CharField(max_length=32)
        age = models.IntegerField()
        # author_detail = models.ForeignKey(unique=True,to='AuthorDetail')
        author_detail = models.OneToOneField(to='AuthorDetail')
    
    
        def __str__(self):
            return self.name
    
    class AuthorDetail(models.Model):
        phone = models.BigIntegerField()
        addr = models.CharField(max_length=64)
    
        def __str__(self):
            return self.addr
    
    
    

    一对多字段增删改查

    #增
    models.Book.objects.create(title='三国演义',price=123.23,publish_id=1)
    
    publish_obj=models.Publish.objects.filter(pk=2).first()
    models.Book.objects.create(title='水浒传',price=123.23,publish=publish_obj)
    
    #查
    book_obj=models.Book.object.filter(pk=1).first()
    print(book_obj.publish)  # 获取到当前所对应的出版社对象
    print(book_obj.publish_id)  # 获取到的就是表中的实际字段
    
    #改
    models.Book.objects.filter(pk=1).update(publish_id=3)
    
    publish_obj = models.Publish.objects.filter(pk=2).first()
    models.Book.objects.filter(pk=1).update(publish=publish_obj)
    
    #删除
    models.Publish.object.filter(pk=2).delete()
     # 默认也是级联更新 级联删除
    

    多对多字段的四个方法

    #增
    # 给主键为3的书籍添加两个作者 1 2
    book_obj = models.Book.objects.filter(pk=3).first()
    #print(book_obj.authors)  # 就相当于 已经在书籍和作者的关系表了
    #book_obj.authors.add(1)
    #book_obj.authors.add(2,3)
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    #book_obj.authors.add(author_obj)
    book_obj.authors.add(author_obj,author_obj1)
    
    """
    add() 括号内既可以传数字也可以传数据对象
    并且都支持传多个
    """
    
    #改
    book_obj = models.Book.objects.filter(pk=3).first()
    # book_obj.authors.set([3,])
    # book_obj.authors.set([1,3])
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    book_obj.authors.set((author_obj,))
    book_obj.authors.set((author_obj,author_obj1))
    
    """
    set() 括号内 既可以传数字也传对象 
    并且也是支持传多个的
    但是需要注意 括号内必须是一个可迭代对象
    """
    
    #删
    book_obj = models.Book.objects.filter(pk=3).first()
    # book_obj.authors.remove(2)
    # book_obj.authors.remove(1,2)
    
    author_obj = models.Author.objects.filter(pk=1).first()
    author_obj1 = models.Author.objects.filter(pk=2).first()
    # book_obj.authors.remove(author_obj)
    book_obj.authors.remove(author_obj,author_obj1)
        """
        remove() 括号内 既可以传数字也传对象 
        并且也是支持传多个的
        """
    
    #清空
    book_obj = models.Book.objects.filter(pk=3).first()
    book_obj.authors.clear()
    """clear()括号内不需要传任何参数 直接清空当前书籍对象所有的记录"""
    
    
  • 相关阅读:
    排序算法-Java实现
    Linux-文件内容的查阅
    Linux-文件权限概念
    Linux-awk和sort处理字符串
    面试题-总结(二)
    面试题-总结(一)
    程序员的其他技能:股票-ROE解释
    程序员的其他技能:基金初识-基金名称的秘密
    tp框架表单验证 及ajax
    tp框架做留言板
  • 原文地址:https://www.cnblogs.com/aden668/p/11734390.html
Copyright © 2020-2023  润新知