django多表查询
表结构定义如下:
from django.contrib.auth.models import User
class Project(models.Model):
name=models.CharField(maxlength=200, unique=True,db_index=True,null=False)
member=models.ManyToManyField(User)
owner=models.ForeignKey(User,related_name='owner')
description=models.CharField(maxlength=500,null=True)
insert_data=models.DateTimeField(auto_now_add=True)
如果我现在知道一个User.username我想查询这个user所有的project,这个用django到orm怎么来实现,我在网上看到有下面的这种写法,但是不太明白如何解释:
假设我有两个表(model),分别叫useraccount和userrole:
class UserAccount(meta.Model):
person = meta.ForeignKey(Person, core=True)
account = meta.ForeignKey(User, core=True)
class UserRole(meta.Model):
account = meta.ForeignKey(UserAccount, core=True)
group = meta.ForeignKey(Group, core=True)
active = meta.BooleanField(_('Active?'), default=True)
如果我知道useraccount中某个字段(field)的值,那么我就能取到相应的userrole:
userroles.get_object(account__person__id__exact=xxx)
userroles.get_object(account__account__id__exact=xxx)
userroles.get_object(account__id__exact=xxx)
这似乎不是什么技巧,但是我以前确实没想到,既然有同事在codereview中给我指出来,记下来以后改进。
谢谢!
在与已有数据库集成的时候,外键的设置方法:
当你在使用已有的数据库,即是先有数据库表,然后使用python manage.py inspectdb 生成的models.py
文件,为了进行多表联合查询,可以使用Foreignkey来在models文件中进行进行设置,比如说:
class Test():
id=models.IntergerField(primarykey=true)
user = models.ForeignKey(User, core=True)
class User():
user_id=models.IntergerField(primarykey=true)
user_name=models.CharField(maxlength=500,null=True)
这样的话,我们在别处就可以通过Test.user_id来访问User的主键:
result=Test.objects.get(id=1)
result.user_id 是可以的
result.user.user_id也是可以的。
有一点比较奇怪,也是笔者不太明白的是,如果要在对Test对象进行查询的时候,对user_id进行限制的话,不能用点操作符了,而必须使用
双下划线,比如说要取user_id等于1的Test对象,则使用下面的语句:
Test.objects.filter(user__user_id=1)
分析可以发现,在查询的条件当中,所有的这种上下级的操作符都是双下划线,比如说__gt __lt __year __month 再到这里的user__user_id
上面的都是凭回忆写的,如有不当还请指正!