首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django-ORM:说明对情况的精确查询

Django-ORM:说明对情况的精确查询
EN

Stack Overflow用户
提问于 2012-03-12 14:23:12
回答 3查看 103关注 0票数 0

我在我的项目中有4个模型。它们是:

代码语言:javascript
复制
class Company(Group):

address_1 = models.CharField(max_length = 300, blank = True, null = True)
web_site = models.URLField(blank = True, null = True)
office_number = models.CharField(max_length = 20, blank = True, null = True)


class Person(models.Model):

user = models.ForeignKey(User)
company = models.ForeignKey(Company)


class Project(models.Model):

name = models.CharField(max_length = 100)
person = models.ManyToManyField(User, through = 'UserProject')


class UserProject(models.Model):

user = models.ForeignKey(User)
project = models.ForeignKey(Project)
is_owner = models.BooleanField(default = False)

从我想要的角度来看

  1. 所有与request.user相关的项目
  2. 从事这些项目的公司
  3. 以及那些公司的员工

我尝试过编写一些代码,但查询并不精确。我会很感激你的帮助!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-20 13:14:16

我已经思考并使用了上面列出的一些解决方案,但是没有什么是我想要的。对我来说,下面的代码很好用

代码语言:javascript
复制
            projects = Project.objects.filter(person = request.user)

            user_projects = UserProject.objects.filter(project__in = projects)

            for user_project in user_projects:
                person = user_project.user.get_profile()
                company.append(person.company)
                people.append(person)

            company = set(company)
票数 0
EN

Stack Overflow用户

发布于 2012-03-12 14:41:32

  1. 当然,与request.user相关的所有项目都很简单: Project.objects.filter(person=request.user)
  2. 从事这些项目的公司必然要求您遍历这些项目: 对于项目中的p: p.company_set.all()
  3. UserCompany之间,或者在Company上的任何其他外键之间没有任何关系,所以我不知道"employee“这个概念是从哪里来的,也不知道如何得到它。

因为,这是非常基本的东西,我假设您的问题是事实1*N查询是生成的。在Django的当前版本(1.3.1)中,无法进一步优化这个版本。在Django 1.4中,有prefetch_related,允许您使用Projects选择所有公司(和员工)。但是,它仍然需要对每个关系进行唯一的查询,因此,3总计可以获得项目、公司和员工。它的工作方式如下:

代码语言:javascript
复制
Project.objects.filter(person=request.user).prefetch_related('company')

同时,我在使用django-批-选择方面也取得了一些成功,它基本上试图模仿prefetch_related的行为。

票数 0
EN

Stack Overflow用户

发布于 2012-03-12 14:43:50

好吧,您的模型中有一些bug:

  • 项目通过UserProject对用户有一个M2M,这很好,但我认为您的意思是在用户上有一个FK的M2M。
  • 第二,你还没有和公司建立任何关系。在错误被修复之前,没有办法去做列表中的第2项。
  • 为什么是公司扩展集团?我一定是漏掉了什么。
  • 没有员工模式

示例:

代码语言:javascript
复制
class Company(models.Model):
    address_1 = models.CharField(max_length = 300, blank = True, null = True)
    web_site = models.URLField(blank = True, null = True)
    office_number = models.CharField(max_length = 20, blank = True, null = True)


class Employee(models.Model):
    user = models.ForeignKey(User)
    company = models.ForeignKey(User)


class Project(models.Model):
    name = models.CharField(max_length = 100)
    employees = models.ManyToManyField(Employee, through = 'EmployeeProject')
    companies = models.ManyToManyField(Company)


class EmployeeProject(models.Model):

    employee = models.ForeignKey(Employee)
    project = models.ForeignKey(Project)
    is_owner = models.BooleanField(default = False)

在视野中

代码语言:javascript
复制
# all of the projects for a user (assuming employee field is supposed to M2M to the Employee model
projects = Project.objects.filter(employees__user=request.user)
for project in projects :
    # assuming that there was some connection between project and company (there isnt currently, see me list of bugs with your models)
    for company in project.companies_set.all() :
        # There is no employee model, but if there was
        employees = company.employees_set.all()    
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9668858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档