【问题标题】:Django : join without related objectDjango:加入没有相关对象
【发布时间】:2015-08-04 13:27:15
【问题描述】:

我在 django 中有两个模型:

class Matching(models.Model):
    representative_remote_id = models.CharField(max_length=200, null=True)
    representative_name = models.CharField(max_length=200)
    representative_group = models.CharField(max_length=200)


class Vote(models.Model):
    representative_name = models.CharField(max_length=200, blank=True, null=True)
    representative_remote_id = models.CharField(max_length=200, blank=True, null=True)
    # ...

如您所见,这两个模型之间没有关系。 我想要的是选择所有投票:

vote.representative_name = CONCAT(matching.mep_name, ' (', matching.mep_group, ')')
AND matching.representative_remote_id IS NULL
AND vote.representative_remote_id IS NOT NULL

我找不到使用 django 执行此操作的方法(不使用“原始”sql 查询)

【问题讨论】:

  • 让您加入 rep_name = concat(match.mep_name etc...) 并将您的 matching.rep_rem_id 为 null 并且 vote.rep_rem_id 在您的 where 子句中不为 null ------- -- 这并不是说你没有关系,而是你的关系在第二个表中的多个字段中被拆分,如果你在两个表之间的任何地方使用“=”并且有一个结果,那就是一个关系
  • 谢谢 Jeremy C,但我不知道该怎么做,你能提供一个小代码示例吗?
  • 你介意它是直接的 sql 吗?你能提供我表中的一些数据吗?我将创建一个 sqlfiddle 来解释我的意思,即如果我能在 45 分钟内完成这项工作,因为那是我需要离开的时候
  • 嗯,我知道sql请求,但我想用django数据库函数来做。
  • 那么我将不得不让你失望,因为即使是一般的 python,我也没有任何经验

标签: python sql django


【解决方案1】:

我认为您可以获取所有Matching 对象并对其应用过滤器,然后使用该结果获取Vote 对象。

类似:

representative_names = ["{name} ({group})".format(name=field[0], group=field[1]) for field in Matching.objects.filter(representative_remote_id=None).values_list('representative_name', 'representative_group')]
Vote.objects.exclude(representative_remote_id=None).filter(representative_name__in=representative_names)

【讨论】:

  • 这是两个SQL查询,在SQL中只需要一个查询就可以完成。我不知道 django 是否可以......
  • stackoverflow.com/questions/252976/full-outer-join-in-django Django 不支持通常 SQL 意义上的“连接”——它支持对象导航。请注意,关系连接(内部或外部)会创建一个新的实体“类”。一个在 Django 中没有定义的。所以没有适当的“结果集”,因为你得到的东西没有类定义。
猜你喜欢
  • 2021-04-24
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 2020-07-16
  • 2019-02-14
  • 1970-01-01
相关资源
最近更新 更多