我的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)
table 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的值,如何获取所有的值?
发布于 2018-12-07 07:28:48
定义表,并将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
为表生成一个类文件。
发布于 2018-12-07 22:40:02
可以使用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'
)
https://stackoverflow.com/questions/53661147
复制相似问题