2013-05-02 11 views
5

Mam następującą sytuację. Mam trzy modele, Post, User i Friends.django jest sposób na adnotację zagnieżdżonego obiektu?

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) 

Za każdym razem przynieść użytkownikom, chcę przynieść liczbę swoich przyjaciół:

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

to działa prawidłowo.

Jednak chcę, aby to działało, gdy wprowadzę użytkowników jako zagnieżdżone obiekty Post. Używam tam select_related aby zminimalizować DB wymaga, więc chcę zrobić coś takiego:

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

Jednak to stwarza user__fc polu pod postu, a nie pole fc pod post.user. Czy istnieje sposób na osiągnięcie tej funkcji?

Odpowiedz

0

Można zdefiniować niestandardowy żłóbek dla swoich modeli, zgodnie z opisem here, a następnie zastąpić jego metodę get_queryset(), aby dodać niestandardową kolumnę do modelu po zapytaniu.

Aby użyć tego menedżera do relacji odwrotnej, należy ustawić menedżera bazy zgodnie z opisem w docs.

Innym podejściem byłoby coś w rodzaju this, które określa menedżer powiązanego modelu z zakodowanym atrybutem.

Powiązane problemy