2009-06-18 2 views
2

Я, выполняя следующий код (имена изменены, чтобы защитить невинных, поэтому структура модели может показаться странным):Django ORM Создает Phantom Алиас в SQL Регистрация

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 Регистрация на утверждение refere используя псевдоним, который не был определен. Любые идеи, почему !? Я бросил свою базу данных 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 
+1

My django orm на самом деле не так уж велико, поэтому я не совсем понимаю все, что происходит, но ошибка выглядит очень похожей на ту, что встречается на http://code.djangoproject.com/ticket/9188 –

+0

Да, ты прав. Когда я внедрил изменение в ревизии, связанную в нижней части этого закрытого билета, ORM теперь работает правильно. –

ответ

1

Я думаю, что это может быть симптомом:

http://code.djangoproject.com/ticket/9188

, который был зафиксирован в ревизии Джанго 9589, я думать. Теперь, как выяснить, какая ревизия я работаю от ...


Подтверждено. Когда я осуществил изменение ссылки в приведенном выше билете:

http://code.djangoproject.com/changeset/9589

моя ошибка ушла.

+0

Чтобы найти свою ревизию, зайдите в ./manage.py оболочку и выполните: >>> import django >>> django.get_version() u'1.0-final-SVN-11012 ' –

+0

Когда я использую 'get_version 'function Я не получаю номер ревизии, просто '1.0-final' ... darn. –