【问题标题】:Django: Access model through another modelDjango:通过另一个模型访问模型
【发布时间】:2009-12-05 20:24:22
【问题描述】:
class Project(models.Model):
    title = models.CharField()  

class Job(models.Model):
    name = models.CharField()
    user = models.ForeignKey(User)
    project = models.ForeignKey(Project)  

每个项目我都有很多工作。如何获取项目所有作业的所有用户的列表?
我想出了这个:

users = set()
for job in project.job_set.all():
    users.add(job.user)

有没有更简单的方法,无需显式循环遍历每个作业?

【问题讨论】:

  • 你也可以写users = set(job.user for job in project.job_set.all())

标签: django model


【解决方案1】:

使用Django's join syntax 并从您的User 模型开始:

users = User.objects.filter(job_set__project=project).distinct()

【讨论】:

  • 这一行似乎不起作用 - 说无法将关键字“job_set”解析为字段。选择是:
  • 我认为应该有工作而不是 job_set。谢谢它的工作原理!
  • 根据您问题中的代码,由于您没有在ForeignKey 中指定related_name,它应该默认为job_set。如果您改为:user = models.ForeignKey(User, related_name='jobs'),那么您将根据jobs__project=project进行过滤
  • 这很有趣,因为我没有指定相关的名称,它仍然是模型的名称而不是字段的名称。我也在其他型号上试过。也许是因为我使用的是 django 的 alpha 版本
  • 很奇怪。我会小心,因为它不同意文档。这可能是一个错误,但我不知道它是如何通过他们的单元测试的。 docs.djangoproject.com/en/dev/topics/db/models/…
【解决方案2】:

或者,您可以通过 Job 模型使用从 Project 到 User 的 ManyToMany 关系,该模型实际上是一个连接模型:

class Project(models.Model):
   users = models.ManyToManyField(User, through='Job')
   ...

然后简单地做:

project.users.all()

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 1970-01-01
    • 2013-06-12
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 2019-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多