【问题标题】:Django ORM join subtable in query查询中的 Django ORM 连接子表
【发布时间】:2016-02-28 13:01:39
【问题描述】:

我想使用Django ORM。我构建 SQL 查询:

select itinerary.id, count(users.home_location_id) from itinerary_itinerary as itinerary left join (select to_applicationuser_id as id, users.home_location_id from custom_auth_applicationuser_friends as friends join custom_auth_applicationuser as users on friends.to_applicationuser_id = users.id where from_applicationuser_id = 28)
    as users on itinerary.location_id = users.home_location_id 
    WHERE user_id = 28 
    GROUP BY itinerary.id, users.home_location_id

谁能告诉我如何用子查询的表进行左连接?
28 是当前用户 ID。
我使用类似的东西:

Itinerary.object.filter(user_id=28).extra(
            tables=['(select to_applicationuser_id as id, users.home_location_id from custom_auth_applicationuser_friends as friends join custom_auth_applicationuser as users on friends.to_applicationuser_id = users.id where from_applicationuser_id = 28) as users'],
            where=['itinerary.location_id = users.home_location_id']
        )

但我得到了错误

ProgrammingError 关系"(选择to_applicationuser_id为id, users.home_location_id from" 不存在

UPD

模型(只是简单的方案):

class ApplicationUser(models.Model):
    name = models.CharField(max_length=255)
    home_location = models.ForeignKey(Location)
    friends = models.ManyToManyFieled('self')

class Location(models.Model):
    loc_name = models.CharFiled(max_length=255)

class Itinerary(models.Model):
    user = models.ForeignKey(ApplicationUser)
    location = models.ForeignKey(Location)

【问题讨论】:

  • 请发布您的模型(至少是相关字段)。

标签: python django django-orm


【解决方案1】:

当您添加额外的表时,它们会被添加到不接受 sql 语句的 from 列表中。 我认为您根本不需要在这里使用额外的东西,您可以使用 ORM 获得类似的查询,而无需加入 select 语句。以下代码使用过滤和注释,将给出与我能够理解您的查询一样多的结果:

ApplicationUser.objects.filter(
    Q(itinerary__location_id = F('friends__home_location_id')) |
    Q(friends__home_location__isnull=True),
    id=28,                                                    
    ).values_list(
        'itinerary__id', 'friends__home_location_id'
    ).annotate(location_count = Count('friends__home_location_id')
    ).values_list('itinerary__id', 'location_count')

【讨论】:

  • 我想要获取包含itinerary_id, count friends.homelocation_id 的表,对于没有friend.home_location_id 的行程,我想要得到0。您的第一种情况,返回正确答案,但没有带有0 home_location_id 的行程。第二种情况是错误的。
  • 我修改了查询,看看。
  • 有效,但仍不返回 location_count 为 0 的行。
猜你喜欢
  • 2020-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多