用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 %}
这样就可以将多对多,一对多表中重复的字段合并成一条