2013-05-02 3 views
5

У меня есть следующая ситуация. У меня три модели: почта, пользователь и друзья.django есть способ аннотировать вложенный объект?

class User(models.Model): 
    name = models.CharField(max_length=100) 

class Friend(models.Model): 
    user1 = models.ForeignKey(User,related_name='my_friends1') 
    user2 = models.ForeignKey(User,related_name='my_friends2') 

class Post(models.Model): 
    subject = models.CharField(max_length=100) 
    user = models.ForeignKey(User) 

Каждый раз, когда я приношу пользователей, я хочу, чтобы довести количество своих друзей:

User.objects.filter(name__startswith='Joe').annotate(fc=Count('my_friends1')) 

Это прекрасно работает.

Однако, я хочу сделать эту работу, когда я приношу пользователям вложенные объекты Post. Я использую там select_related к минимизированы DB вызовов, так что я хочу сделать что-то вроде:

Post.objects.filter(subject='sport').select_related('user').annotate(user__fc=Count('user__my_friends1')) 

Однако, это создает поле user__fc под должности, а не поле Ь под post.user. Есть ли способ достичь этой функциональности?

ответ

0

Вы можете определить пользовательский ясли для своих моделей, как описано here, а затем переопределить его метод get_queryset(), чтобы добавить пользовательский столбец в вашу модель по запросу.

Чтобы использовать этот менеджер для обратного отношения, вы должны установить базовый менеджер, как описано в docs.

Другим подходом было бы что-то вроде this, которое вы определяете менеджером связанной модели с жестко закодированным атрибутом.

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