2012-02-29 2 views
1

Вот моя модель:Связанные набор GenericForeignKey в Django

class Subscription(models.Model): 
    subscriber = models.ForeignKey(User, related_name="subscription_set") 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    subscribed_to = generic.GenericForeignKey('content_type', 'object_id') 
    created = models.DateTimeField(db_index=True, auto_now_add=True) 
    cancelled = models.DateTimeField(null=True, blank=True) 

Есть два связанных множества в здесь. Один - subscription_set. Другая находится в GenericForeignKey от subscribed_to.

Если у меня есть пользовательский объект, я могу ввести user.subscription_set, чтобы получить набор подписей, которые пользователь является подписчиком. Но мне интересно, как получить второй набор, и узнать, сколько подписчиков пользователь является объектом.

ответ

2

Учитывая пользователя, вы хотите запросить для каждого «подписного» (например, Netflix или National Geographic), на который пользователь подписался. Если я правильно понял вопрос, то это все, что вам нужно:

subscribed_tos = [subscription.subscribed_to for subscription 
    in user.subscription_set.all()] 

Нет, это не возможно сделать это в одном запросе к базе данных. Это должно быть очевидно, если вы знаете, как работает система contenttypes, и знают, что запросы выполняются через SQL.

Однако, если вы хотите, чтобы пользовательские подписки на экземпляры одного класса модели (скажем, на все подписки на журнал для пользователей), вы можете использовать в одном запросе. Просто добавьте GenericRelation к этой модели, и вы можете запросить через нее:

class Subscribable(model.Model): 
    subscriptions = generic.GenericRelation(Subscription) 

    class Meta: 
     abstract = True 

class Magazine(Subscribable): 
    pass 

subscribed_magazines = Magazine.objects.filter(subscriptions__user__exact=user) 
Смежные вопросы