这是我的模特:
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来获取用户所订阅的订阅集。但我想知道如何获得第二组,并找出用户的对象订阅量。
答案 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)