python - 无法从我的数据库访问某些信息与 django 的多对多关系

标签 python mysql django

我正在使用 Django REST Framework 和一个具有多对多关系的 SQL 数据库,这使得在我的应用程序中显示来自数据库的信息变得困难。相关的表格是:

用户:id,密码,last_login,is_superuser,用户名,first_name,last_name,email,is_staff,is_active,date_joined

个人资料:id、user_id、user_organization_id

组织:id, organization_name

profile_projects: id, profile_id, project_id

项目:id,项目名称

我的问题是让项目正确显示在我的个人资料页面上。配置文件和项目是多对多的,这就是为什么它们有自己单独的表格。

这是来自models.py的相关代码

class Project(models.Model):
    id = models.AutoField(primary_key=True)
    project_name = models.CharField(max_length = 30)

    def __str__(self):
        return "%s" % self.project_name

class Profile(models.Model):
    id = models.AutoField(primary_key=True)
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    user_organization = models.ForeignKey(Organization, on_delete=models.CASCADE)
    projects = models.ManyToManyField(Project)

    def __str__(self):
        return "%s's profile" % self.user

然后是我的 profile.html模板是:

{% load staticfiles %}
{% load rest_framework %}
<!DOCTYPE html>
<html>
<head>
    <link rel="stylesheet" type="text/css" href="https://bootswatch.com/yeti/bootstrap.min.css"/>
    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.6/angular.min.js"></script>
    <title>{{profile.user.first_name}}'s Profile</title>
</head>
<body>
    <h1>{{profile.user.get_full_name}}</h1>
    <h2>{{profile.user_organization.organization_name}}</h2>
    <h3>Projects</h3>
    {{profile.projects.all}}
    <h3>Email</h3>
    {{profile.user.email}}
</body>
</html>

与我的样本用户 John Doe 一起,他在组织“Company”的项目“fun”上工作, 他的个人资料页面上的所有内容都正确显示,除了在项目下它有 [<Project: fun>] .我已经尝试了很多事情,这些是我得到的结果:

{{ profile.projects }}在我的模板中在网页上产生“app.Project.None”(app 是我的 Django 应用程序的名称)

{{ profile.projects.name }}产生“无”

{{ profile.projects.all.name }}不会显示任何内容。所以我知道我很接近但我如何获得 [<Project: ___ >]不出现在项目名称周围?我认为这个问题源于 profile_projects 是多对多的,因为所有其他信息都是一对一或一对多的。

此外,我的示例用户目前每个人只有 1 个项目,一旦我只使用 1 个项目就可以完成所有工作,我将担心为每个配置文件添加和显示多个项目。

最佳答案

当你看到 [<Project: ___ >] ,您会看到一个项目列表。您需要迭代它们或以某种方式展平它们。

把它变成 <ul>

<ul>
{% for project in profile.projects.all %}
    <li>{{ project.name }}</li>
{% endfor %}
</ul>

您可能会发现花时间学习如何在 Python 和 Django 中进行内省(introspection)是值得的。真的很方便!!我建议安装 ipython这样 Django 的 manage.py shell使用起来更友好。

在 shell 提示符下,您可以导入模型并加载示例对象:profile = mymodels.Profile.objects.get.latest('id')然后使用 tabdir()检查对象的属性。

关于python - 无法从我的数据库访问某些信息与 django 的多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37845480/

相关文章:

python - 如何在函数之间解析 pandas 数据帧

python - 如何制作 while(True) : two loops run at same time in python

php - 错误:警告:mysqli_query()至少需要2个参数,其中1个在

python - django-cart 还是 Satchmo?

python - 如何为受身份验证保护的 REST API 编写 Django 单元测试?

python - 序列化器无法添加额外数据

python - 带线程的交互式脚本

python - 使用 Python/PIL 的多边形裁剪/剪辑

MySQL 内部连接别名问题

mysql - 将备份表中的列行插入到新表中