【问题标题】:Django Inner join using ORM使用 ORM 的 Django 内部连接
【发布时间】:2018-12-06 23:19:40
【问题描述】:

我的 sqlite3 数据库中有以下表格:

PRAGMA table_info(auth_user);

0|id|integer|1||1
1|password|varchar(128)|1||0
2|last_login|datetime|0||0
3|is_superuser|bool|1||0
4|username|varchar(150)|1||0
5|first_name|varchar(30)|1||0
6|email|varchar(254)|1||0
7|is_staff|bool|1||0
8|is_active|bool|1||0
9|date_joined|datetime|1||0
10|last_name|varchar(150)|1||0




  PRAGMA table_info(accounts_member);
    0|id|integer|1||1
    1|team_id|integer|1||0
    2|user_id|integer|1||0
    3|department_id|integer|1||0

最后:

PRAGMA table_info(accounts_department);
0|id|integer|1||1
1|name|varchar(20)|1||0
2|description|varchar(255)|1||0

以上三个表以下列方式相互关联:

auth_user 是链接表的主表。 accounts_member 使用外键 user_id 引用 auth_user,还使用外键 department_id 引用 accounts_department

    select * from auth_user
 inner join accounts_member on accounts_member.user_id = auth_user.id 
inner join account_department on account_department.department_id = accounts_member.id

我有不同的教程,但我得到的大多数教程都需要使用 where 函数条件。

以下是我的模型: 对于accounts_department

class Department(models.Model):
    class Meta:
        get_latest_by = "name"

    name = models.CharField(max_length=20)
    description = models.CharField(max_length=255)

    def __str__(self):
        return self.name

    def get_absolute_url(self):
        return 

对于accounts_member:

class Member(models.Model):
    team = models.ForeignKey(Profile, models.CASCADE)
    user = models.ForeignKey(User, models.CASCADE, related_name="memberships")
    department = models.OneToOneField(Department, models.CASCADE, blank=True, null=True)

并且表 auth_user 使用 django 的内置模型。

我在 views.py 中尝试了以下内容:

profile = request.profile
    department = Department.objects.all()
    members = Member.objects.filter(is_active=1).select_related("user","department")
    data  = {
        "page": "profile",
        "profile": profile,
        'departments': department,
        "members_list": members,
        "show_api_keys": False,
        "api_status": "default",
        "team_status": "default"
    }

但它只返回表 accounts_member 的值,我如何获取所有值?

【问题讨论】:

  • 你能分享你的模型类吗?
  • @ruddra,我已经更新了问题以包括我的模型和视图

标签: django python-3.x django-models django-views


【解决方案1】:

定义表,让cols 成为列列表。 然后你想要这样的东西:

import sqlalchemy as sa
import sqlalchemy.orm as orm

sess = orm.sessionmaker(engine)()
q = (sess
     .query(*cols)
     .join(accts_member, accts_member.c.user_id == auth_user.c.id)
     .join(acct_dept, acct_dept.c.department_id == accts_member.c.id))
for row in q:
    print(row)

我通常会这样定义一个表:

meta = sa.MetaData(bind=engine)
acct_dept = sa.Table('account_department', meta, autoload=True)

或者有时我会使用sqlacodegen 为表格生成类文件。

【讨论】:

    【解决方案2】:

    您可以使用values 指定您想要的值,包括来自相关对象的值。 Django 将在幕后执行连接。

    例如:

    members = Member.objects.filter(user__is_active=1).values(
        'id',
        'user__id', 
        'user__last_login',
        'user__is_superuser',
        'user__username', 
        'user__firstname',
        'user__email', 
        'user__is_staff',
        'user__date_joined',
        'user__last_name',
        'department__id',
        'department__name',
        'department__description'
    )
    

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 2017-04-29
      • 2018-06-28
      • 2015-06-22
      • 1970-01-01
      • 2013-03-22
      • 2018-04-26
      • 2014-06-19
      • 2020-05-21
      相关资源
      最近更新 更多