Python, Django: 查询组合模型?
Python, Django: Query on combined models?
在我的应用程序中,我有多个 模型,例如:
models.py:
class Company(models.Model):
name = models.CharField(max_length=100)
class Coworker(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
company = models.ForeignKey(Company, null=False, blank=False, on_delete=models.CASCADE)
如您所见,一个公司可以包含一个、多个或没有同事!是否可以查询 Company 但也可以从连接的 Coworker 接收数据?例如这样的事情:
id | Company | Coworker
1 | Company_A | Coworker_A
2 | Company_B |
3 | Company_C | Coworker_B
4 | Company_C | Coworker_C
5 | Company_C | Coworker_D
6 | Company_D | Coworker_E
7 | Company_D | Coworker_F
8 | Company_E |
9 | Company_F | Coworker_G
10 | Company_F | Coworker_H
...
我的问题是,我无法查询 Coworker,因为我不想错过那些 Companies没有相关数据!
感谢您的帮助,祝您今天愉快!
很简单,按公司查询并为工人预取结果:
Company.objects.prefetch_related("coworker_set").all()
这样做的目的是为您提供一个公司列表,其中包含属性 coworker_set
中的员工列表。它还将在单个查询中填充这些属性(这就是 prefetch_related
的重点)。
更具体地说,您可以通过以下方式使用此类查询:
for company in Company.objects.prefetch_related("coworker_set").all():
print(company.name)
for coworker in company.coworker_set.all():
print(coworker.first_name)
print(coworker.last_name)
这保证您将遍历所有公司以及所有同事,并且您只会遍历每个公司一次(实际上,如果您通过同事查询,您会多次看到一些公司,而另一些 none)。
在我的应用程序中,我有多个 模型,例如:
models.py:
class Company(models.Model):
name = models.CharField(max_length=100)
class Coworker(models.Model):
first_name = models.CharField(max_length=50)
last_name = models.CharField(max_length=50)
company = models.ForeignKey(Company, null=False, blank=False, on_delete=models.CASCADE)
如您所见,一个公司可以包含一个、多个或没有同事!是否可以查询 Company 但也可以从连接的 Coworker 接收数据?例如这样的事情:
id | Company | Coworker
1 | Company_A | Coworker_A
2 | Company_B |
3 | Company_C | Coworker_B
4 | Company_C | Coworker_C
5 | Company_C | Coworker_D
6 | Company_D | Coworker_E
7 | Company_D | Coworker_F
8 | Company_E |
9 | Company_F | Coworker_G
10 | Company_F | Coworker_H
...
我的问题是,我无法查询 Coworker,因为我不想错过那些 Companies没有相关数据!
感谢您的帮助,祝您今天愉快!
很简单,按公司查询并为工人预取结果:
Company.objects.prefetch_related("coworker_set").all()
这样做的目的是为您提供一个公司列表,其中包含属性 coworker_set
中的员工列表。它还将在单个查询中填充这些属性(这就是 prefetch_related
的重点)。
更具体地说,您可以通过以下方式使用此类查询:
for company in Company.objects.prefetch_related("coworker_set").all():
print(company.name)
for coworker in company.coworker_set.all():
print(coworker.first_name)
print(coworker.last_name)
这保证您将遍历所有公司以及所有同事,并且您只会遍历每个公司一次(实际上,如果您通过同事查询,您会多次看到一些公司,而另一些 none)。