在Django中,如何将复合主键的表与另一个表连接?

1 投票
1 回答
1823 浏览
提问于 2025-04-18 11:05

这是我目前的模型情况:

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')

撰写回答