用django从数据库中取多对多数据将id相同数据一行显示

一、

  在models中要查询表对应的函数中专门写一个要查询对应字段的函数,到时候使用时,到时候使用的时候用对象来调用此方法

  

class Book(models.Model):
    title=models.CharField(max_length=32)
    publishDate=models.DateField()
    price=models.DecimalField(max_digits=5,decimal_places=2)
    publishs=models.ForeignKey(to='Publish')
    authors=models.ManyToManyField(to='Author')
    def __str__(self):
        return self.title
    def author_name(self): #创建一个作者表的方法
        ret = self.authors.all()#查询当前对象的所有作者
        li = [author.name for author in ret]#用列表推导式将查出来的所有作者名字写入列表
        res=','.join(li)#用逗号间隔

        return ','.join([author.name for author in self.authors.all()])#简写方式
        
        return res  

二、

  

# cursor = connection.cursor()
# cursor.execute("

SELECT
  app01_book.id,
  app01_publish.`name`,
  app01_book.title,
  app01_book.price,
  app01_book.publishDate,
  GROUP_CONCAT(
    app01_author.`name` SEPARATOR ','
  )
FROM
  app01_book
INNER JOIN app01_publish ON app01_book.publishs_id = app01_publish.id
INNER JOIN app01_book_authors ON app01_book.id = app01_book_authors.book_id
INNER JOIN app01_author ON app01_book_authors.author_id = app01_author.id
GROUP BY
  app01_book.title
ORDER BY
  app01_book.id

")
# ret = cursor.fetchall()
1.GROUP_CONCAT()中的值为你要合并的数据的字段名; 
 SEPARATOR 函数是用来分隔这些要合并的数据的;
 
' '中是你要用哪个符号来分隔;
2.必须要用GROUP BY 语句来进行分组管理,不然所有的数据都会被合并成一条记录

在html文件中
% for foo in book %}
<tr>
<td>{{ forloop.counter }}</td>
<td>{{ foo.1}}</td>
<td>{{ foo.2}}</td>
<td>{{ foo.3|date:"Y-m-d" }}</td>
<td>{{ foo.4 }}</td>
<td>{{ foo5 }}</td>
<td><samp><a href="/update/?id={{ foo.0 }}" type="text-decoration: none;color: #e6e6e6" class="btn btn-warning">编辑</a></samp><samp>
<a href="/delete/?id={{ foo.0 }}" class="btn btn-danger">删除</a></samp></td>
</tr>
{% endfor %}
这样就可以将多对多,一对多表中重复的字段合并成一条
 

 

posted @ 2019-07-29 16:04  happy豪  阅读(1106)  评论(0编辑  收藏  举报