在Django中,如何将复合主键的表与另一个表连接?
这是我目前的模型情况:
class Lead(models.Model):
user = models.ForeignKey(User, related_name='leads')
site = models.ForeignKey(Site)
...
class UserDemographic(models.Model):
user = models.ForeignKey(User, related_name='user_demographic')
site = models.ForeignKey(Site)
...
class Meta:
unique_together = 'user', 'site'
在第一个模型中,我们按网站和用户来记录潜在客户。也就是说,同一个用户在某个网站上可以有多个潜在客户记录。在第二个模型中,我们存储每个用户的人口统计数据。对于每个网站,每个用户只有一条人口统计数据记录。
我想做的是把这些人口统计数据加到我们的潜在客户查询中。每个潜在客户都有对应的用户和网站,我想从人口统计表中提取数据,并把它和相应的潜在客户配对。所以,基本上我需要的是一个左连接,来把这两个表连接起来。当只有一个外键的时候,这个操作相对简单,但当有两个外键需要连接表的时候,我就不知道该怎么做了。
有没有什么想法?在Django中真的有办法做到这一点吗,还是我得使用原始查询?谢谢!
1 个回答
1
Django的ORM(对象关系映射)不支持直接这样做,但你可以通过使用extra
方法来减少原始SQL的使用。你可以试试像下面这样的写法:
Lead.objects.extra(tables=['appname_userdemographic'],
where=['appname_userdemographic.user_id=appname_lead.user_id',
'appname_userdemographic.site_id=appname_lead.site_id'],
select={'country': 'appname_userdemographic.country'})
另外,你也可以重新设计你的模型,这样就不需要复合键了。比如,可以创建一个UserSite模型,然后把你的lead和demographic模型与它关联起来。
class UserSite(models.Model):
user = models.ForeignKey(User)
site = models.ForeignKey(Site)
class Lead(models.Model):
user_site = models.OneToOneField(UserSite)
...
class UserDemographic(models.Model):
user_site = models.OneToOneField(UserSite)
...
这样你就可以使用select_related,像这样:
Lead.objects.select_related('usersite__userdemographic')