Django中相关的GenericForeignKey集

时间:2012-02-29 07:23:13

标签: 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的{​​{1}}。

如果我有一个用户对象,我可以输入user.subscription_set来获取用户所订阅的订阅集。但我想知道如何获得第二组,并找出用户的对象订阅量。

1 个答案:

答案 0 :(得分:2)

鉴于用户,您希望查询用户订阅的每个“可订阅”(例如Netflix或国家地理)。如果我正确地理解了这个问题,那么这就是你所需要的:

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)
相关问题