Django中多表关联的展示问题:

增加一个知识点,当表中有多对多关联时,在前端展示的时候是一个列表,所以在展示的时候需要这样做;

表结构:

class ProjectEnv(models.Model):
    project = models.ForeignKey(verbose_name='项目', to='Project')
    env_choices = (
        (1, '测试'),
        (2, '正式')
    )
    env = models.IntegerField(verbose_name='环境', choices=env_choices)
    path = models.CharField(verbose_name='线上部署路径', max_length=128)
    servers = models.ManyToManyField(verbose_name='服务器', to='Server')

前端页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>


<h1 class="container">环境展示</h1>


<div class="container">

    <form action="" method="post">
        {% csrf_token %}
    <a href="{% url 'web:addprojectenv' %}" class="btn btn-success">添加数据</a>
        <table class="table table-hover">
            <thead>
            <tr>
                <td>序号</td>
                <td>项目</td>
                <td>环境</td>
                <td>线上部署路径</td>
                <td>服务器</td>
                <td>操作</td>
            </tr>
            </thead>
            <tbody>
            {% for d in data %}
                <tr>
                    <td>{{ forloop.counter }}</td>
                    <td>{{ d.project.title }}</td>
                    <td>{{ d.env }}</td>
                    <td>{{ d.path }}</td>
                    <td>
                        <---->d.servers.values点出来的是一个queryset类型是一个列表,所以循环这个列表,然后获取每一个字典的值就行</---->
                        {% for datum in  d.servers.values  %}
                                {{ datum.hostname }}
                        {% endfor %}
                    </td>
                    <td>
                        <a href="{% url 'web:editprojectenv' d.id %}" class="btn btn-info">编辑</a>
                        <a href="{% url 'web:deleteprojectenv' d.id %}" class="btn btn-danger">删除</a>
                    </td>
                </tr>
            {% endfor %}


            </tbody>
        </table>
    </form>

</div>

</body>
</html>

还有一个方法就是在models文件里写一个方法,将这个对象获取写一个列表推导式

class ProjectEnv(models.Model):
    project = models.ForeignKey(verbose_name='项目', to='Project')
    env_choices = (
        (1, '测试'),
        (2, '正式')
    )
    env = models.IntegerField(verbose_name='环境', choices=env_choices)
    path = models.CharField(verbose_name='线上部署路径', max_length=128)
    servers = models.ManyToManyField(verbose_name='服务器', to='Server')

    def get_hostname(self):
        return ','.join([i["hostname"] for i in self.servers.values()])
原文地址:https://www.cnblogs.com/zhufanyu/p/11954044.html