Django ORM 在 SQL Join 中创建幻影别名
Posted
技术标签:
【中文标题】Django ORM 在 SQL Join 中创建幻影别名【英文标题】:Django ORM Creates Phantom Alias in SQL Join 【发布时间】:2010-11-04 01:38:31 【问题描述】:我正在执行以下代码(更改名称以保护无辜者,因此模型结构可能看起来很奇怪):
memberships =
models.Membership.objects.filter(
degree__gt=0.0,
group=request.user.get_profile().group
)
exclude_count =
memberships.filter(
member__officerships__profile=request.user.get_profile()
).count()
if exclude_officers_with_profile:
memberships = memberships.exclude(
member__officerships__profile=request.user.get_profile()
)
total_count = memberships.count()
此时导致:
OperationalError at /
(1054, "Unknown column 'U1.id' in 'on clause'")
生成的SQL是:
SELECT
COUNT(*)
FROM
`membership`
WHERE (
`membership`.`group_id` = 2 AND
`membership`.`level` > 0.0 AND
NOT (
`membership`.`member_id`
IN (
SELECT
U2.`member_id`
FROM
`membership` U0 INNER JOIN `officers` U2
ON (U1.`id` = U2.`member_id`)
WHERE U2.`profile_id` = 2
)
)
)
SQL Join 的 ON 语句似乎引用了一个尚未定义的别名。任何想法为什么!我删除了我的 mysql 数据库并重新同步了我的模型中的表,以尝试确保那里没有任何不一致。
我使用的模型的结构是:
class Membership(models.Model):
member = models.ForeignKey(Member, related_name='memberships')
group = models.ForeignKey(Group, related_name='memberships')
level = models.FloatField(default=0.0)
class Member(models.Model):
name = models.CharField(max_length=32)
class Officer(models.Model):
member = models.ForeignKey(Member, related_name='officerships')
profile = models.ForeignKey(UserProfile)
class UserProfile(models.Model)
group = models.ForeignKey(Group)
class Group(models.Model)
pass
【问题讨论】:
我的 django orm 并不是那么好,所以我不太了解发生的一切,但错误看起来与在 code.djangoproject.com/ticket/9188 遇到的错误非常相似 是的,你是对的。当我在此已关闭票证底部链接的修订版中实施更改时,ORM 现在可以正常工作。 【参考方案1】:我认为这可能是以下症状:
http://code.djangoproject.com/ticket/9188
我认为这是从 django 修订版 9589 开始修复的。现在如何确定我正在使用哪个版本...
已确认。当我实施上述票证中引用的更改时:
http://code.djangoproject.com/changeset/9589
我的错误消失了。
【讨论】:
要找到你的修订版,进入 ./manage.py shell 并执行: >>> import django >>> django.get_version() u'1.0-final-SVN-11012' 当我使用get_version
函数时,我没有得到修订号,只是'1.0-final'......该死。以上是关于Django ORM 在 SQL Join 中创建幻影别名的主要内容,如果未能解决你的问题,请参考以下文章