Django ORMはSQL Joinでファントムエイリアスを作成します
-
06-07-2019 - |
質問
次のコードを実行しています(無実の人を保護するために名前が変更されたため、モデル構造が奇妙に見えるかもしれません):
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
解決
これは次の症状の可能性があると思います
http://code.djangoproject.com/ticket/9188
これはdjangoリビジョン9589の時点で修正されたと思います。次に、どのリビジョンから作業しているかを判断する方法...
確認済み。上記のチケットで参照されている変更を実装したとき:
http://code.djangoproject.com/changeset/9589
私のエラーはなくなりました。
所属していません StackOverflow