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

上面的都是凭回忆写的,如有不当还请指正!

posted on 2011-06-11 17:12  xuq  阅读(444)  评论(0编辑  收藏  举报

导航