有多对多字段的时候自己创建的第三章表就是中介模型

  1. class Article(models.Model):
  2. '''
  3. 文章表
  4. '''
  5. title = models.CharField(max_length=64,verbose_name="文章标题")
  6. summary = models.CharField(max_length=244, verbose_name="文章概要")
  7. create_time = models.DateTimeField(verbose_name="创建时间",auto_now_add=True)
  8. update_time = models.DateTimeField(verbose_name="修改时间",auto_now=True)
  9. up_count = models.IntegerField(verbose_name="点赞数",default=0)
  10. down_count = models.IntegerField(verbose_name="点灭数",default=0)
  11. comment_count = models.IntegerField(verbose_name="评论数",default=0)
  12. read_count = models.IntegerField(verbose_name="阅读数",default=0)
  13.  
  14. user = models.ForeignKey(to="UserInfo",verbose_name="所属作者",null=True,blank=True)
  15. classify = models.ForeignKey(to="Classfication",verbose_name="所属类别",null=True,blank=True)
  16. tags = models.ManyToManyField(to="Tag",through="Article2tag",through_fields=('article', 'tag'),verbose_name="所属标签")
  17. site_article_category = models.ForeignKey(to="SiteArticleCategory",verbose_name="所属文章分类",null=True,blank=True)
  18. class Meta:
  19. verbose_name_plural = "文章表"
  20. def __str__(self):
  21. return self.title
  22.  
  23. class Tag(models.Model):
  24. '''标签表'''
  25. name = models.CharField(max_length=32,verbose_name="标签名")
  26. blog = models.ForeignKey(to="Blog",verbose_name="所属博客")
  27. class Meta:
  28. verbose_name_plural = "标签表"
  29.  
  30. def __str__(self):
  31. return self.name
  32.  
  33. class Article2tag(models.Model):
  34. article = models.ForeignKey(verbose_name="文章",to="Article")
  35. tag = models.ForeignKey(verbose_name="标签",to="Tag")
  36. class Meta:
  37. verbose_name="文章和标签关系表"
  38. '''联合唯一'''
  39. unique_together = [
  40. ("article","tag")
  41. ]
  42. def __str__(self):
  43. return self.article.title + " "+self.tag.name
  44.  
  45. 像是这样自己创建的第三张表就属于是中介模型。一般就Django会给我们自动创建第三张表,
  46. 人家自己创建的只是有关系字段,不能在增加其他的字段了,
  47. 如果根据需求添加其他字段,不需要ManytoMany自己创建第三张表就自己设置第三张表
  48. 这就需要我们自己去创建第三张表。
  49. 当然我现在设计的Article2tag这个第三张表就可以在里面添加其他你需要的字段。
  1. 如果用了中介模型了,就不能在用add,remove
  2.  
  3. 为什么不能这样做? 这是因为你不能只创建 article tag之间的关联关系,你还要指定 Membership模型中所需要的所有信息;而简单的addcreate 和赋值语句是做不到这一点的。所以它们不能在使用中介模型的多对多关系中使用。此时,唯一的办法就是创建中介模型的实例。
  4.  
  5. remove()方法被禁用也是出于同样的原因。但是clear() 方法却是可用的。它可以清空某个实例所有的多对多关系:

Django-中介模型的更多相关文章

  1. django中介模型,CBV模型,及logging日志配制

    1.中介模型 中介模型,这个是在我们创建表格时,多对多添加的时候应用到的,通过制定ManyToManyField字段中的through参数来定义,为两者的关系新建一个中介class 为什么会产生这个中 ...

  2. Django进阶之QuerySet和中介模型

    QuerySet QuerySet是查询集,就是传到服务器上的url里面的查询内容.其形态类似于Python的列表,列表中的元素是QuerySet对象.支持大部分列表的内置方法. 可切片 QueryS ...

  3. Django - 回顾(2)- 中介模型

    一.中介模型 我们之前学习图书管理系统时,设计了Publish.Book.Author.AuthorDetail这样几张表,其中Book表和Author表是多对多关系,处理类似这样简单的多对多关系时, ...

  4. Django框架 之 ORM中介模型

    Django框架 之 ORM中介模型 中介模型 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据 ...

  5. Django【第26篇】:中介模型以及优化查询以及CBV模式

    中介模型以及优化查询以及CBV模式 一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' t ...

  6. Django QuerySet和中介模型

    笔记如下 一.QuerySet QuerySet是什么? 类似列表里边存着对象 只和ORM有关系 from app01.models import Book def qDemo(request): b ...

  7. Orm之中介模型

    什么是中介模型 中介模型针对的是ManyToMany(多对多)的时候第三张表的问题, 中介模型其实指的就是我们不通过Django创建第三张表,如果自己不创建第三张表,而是由django给我们创建,那就 ...

  8. 中介模型以及优化查询以及CBV模式

    一.中介模型:多对多添加的时候用到中介模型 自己创建的第三张表就属于是中介模型 class Article(models.Model): ''' 文章表 ''' title = models.Char ...

  9. 中介模型,cbv视图,和查询优化

    中介模型: 处理类似搭配 pizza 和 topping 这样简单的多对多关系时,使用标准的ManyToManyField  就可以了.但是,有时你可能需要关联数据到两个模型之间的关系上. 例如,有这 ...

  10. Django框架(十) Django之模型进阶

    QuerySet对象 可切片 使用Python 的切片语法来限制查询集记录的数目 .它等同于SQL 的LIMIT 和OFFSET 子句. Entry.objects.all()[:5] # (LIMI ...

随机推荐

  1. hdu6097[二分+解析几何] 2017多校6

    /*hdu6097[二分+解析几何] 2017多校6*/ #include <bits/stdc++.h> using namespace std; ; struct node{ doub ...

  2. 【bzoj2698】染色 期望

    题目描述 输入 输入一行四个整数,分别为N.M.S和T. 输出 输出一行为期望值,保留3位小数. 样例输入 5 1 2 3 样例输出 2.429 题解 期望 由于期望在任何时候都是可加的,因此只要算出 ...

  3. Master&Slave是什么?

    由于前段时间公司项目比较赶,一直抽不出时间写博客,今天偷空写一篇吧.前面给大家讲解了单机版redis的基本操作,现在继续给大家讲解一下Redis的进阶部分,主从复制和读写分离. 一.Master&am ...

  4. Topcoder SRMCards ——贪心

    选择一个数x会删去x+1和x-1,问可以最多选多少次. 显然,对于一段连续的数列,贪心的从左向右选取是最优的. 然后就可以贪心的统计答案了. #include <map> #include ...

  5. ubuntu下卸载python2和升级python3.5

    卸载python只需一条语句就可以实现 sudu apt-get remove python ubuntu下安装python3 sudo apt-get install python3 但这样只安装了 ...

  6. Linux运维打怪升级篇,从苦逼到牛逼的必备装备(转)

    http://chenhao6.blog.51cto.com/6228054/1949673

  7. javascript script load related【转】

    先来看这行代码: <script src = "allMyClientSideCode.js"></script> 这有点儿……不怎么样.“这该放在哪儿?” ...

  8. 【kindeditor】KindEditor获取多个textarea文本框的值并判断非空

    kindeditor官网:http://kindeditor.net/demo.php 如何获取多个KindEditor中textarea文本框的值,方式很多种(带有HTML标签). var intr ...

  9. 获取cookie中的某个参数值

    因为cookie的值是很多key=value连接起来的字符串,所以如果要取cookie中某个key的值: function getCookie(name) { let cookieValue = nu ...

  10. Mac下Android SDK更新不了的解决办法

    在hosts文件中加入: 203.208.46.146   dl.google.com 203.208.46.146 dl-ssl.google.com