2013-10-14 3 views
0

У меня есть две модели:Джанго ошибка, когда после отношения отсталые

Base_Activity:

topics = models.ManyToManyField(Topic) 
... some others 

User_Activity:

user = models.ForeignKey(settings.AUTH_USER_MODEL) 
activity = models.ForeignKey(Base_Activity) 
is_archived = models.BooleanField(default=False) 

Теперь я хочу, чтобы запросить Base_activity, чтобы выбрать все строки с тему X и исключить любые строки, имеющие соответствующую строку в User_Activity для user = * current_user * и is_archived = True.


Я прочитал документацию Django о том, как follow relationships backward, так как запрос Base_Activity, но нужна информация от User_Activity которая имеет ForeignKey к первому. Тем не менее, даже этот метод тестирования в Django консоли не работает:

a = Base_Activity.objects.filter(topics__slug = topic) 
a.user_activity_set.all() 
AttributeError: 'InheritanceQuerySet' object has no attribute 'user_activity_set' 

Вопрос: Что такое лучший способ сделать мой запрос? Если это действительно, следуя за ForeignKey назад, то что я делаю неправильно?

ответ

0
a = Base_Activity.objects.filter(topics__slug = topic) 

Это возвращает экземпляр QuerySet, а не экземпляр модели. Вы должны итерацию через него или просто получить из списка:

activities = Base_Activity.objects.filter(topics__slug=topic) 
activities[0].user_activity_set.all() 

В вашем случае вы можете сделать всю работу в одном запросе:

activities = Base_Activity.objects.filter(topics__slug=topic).exclude(user_activity__user=user, user_activity__is_archived=True) 
+0

Привет raacer, это именно тот ответ, на который я надеялся. 'user_activity_set.all()' теперь работает, но, как вы указываете, я должен сделать свой запрос, как ваша строка в обновлении. Благодарю. – jvannistelrooy

0

Что я делаю неправильно?

Я не уверен, что это решит вашу проблему, но в любом случае , пожалуйста, не используйте подчеркивание в именах классов в Python.

+0

Hi raacer, вы можете объяснить мне, почему это плохо идея? – jvannistelrooy

+0

Просто потому, что в соответствии с правилами кодирования значительно облегчается жизнь :) – raacer

+0

PEP 8 говорит: «Почти без исключения имена классов используют соглашение CapWords. В классах для внутреннего использования есть еще одно подчеркивание». Следуйте по этой ссылке для получения дополнительной информации. Http://www.python.org/dev/peps/pep-0008/ – raacer

Смежные вопросы