Django过滤泛型关系

时间:2013-07-08 12:54:35

标签: django

下面有一个模型指向一般关系。这可以是联系对象或客户对象。

class Unsubscribe(models.Model):
    """
    Notes:
    See: http://www.screamingatmyscreen.com/2012/6/django-and-generic-relations/
    """
    content_type = models.ForeignKey(ContentType, help_text="Represents the name of the model")
    object_id = models.PositiveIntegerField(help_text="stores the object id")
    content_object = generic.GenericForeignKey('content_type', 'object_id')

    reason = models.CharField(max_length=60)

    request_made = models.DateTimeField(auto_now_add=True,
                                   help_text="Shows when object was created.")


    class Meta:
        ordering = ['-request_made']

我想列出所有未订阅的订阅客户和联系人仅供用户使用。

 queryset = Unsubscribe.objects.filter()

上面给了我所有取消订阅的客户和联系人通常我会通过做....来解决这个问题....

queryset = Unsubscribe.objects.filter(user=request.user)

但是,Unsubscribe对象没有用户,但客户和联系人都有。

那么如何过滤通用关系呢?

4 个答案:

答案 0 :(得分:2)

你可以试试这个

Unsubscribe.objects.filter(content_type__name='user', user=request.user)

对于content_type__name='user',为用户指定模型类的名称或与之关联的任何名称。

或者这也是

Unsubscribe.objects.filter(content_type__name='user', object_id=request.user.id)

答案 1 :(得分:2)

我认为你的模型就像:

class Contact(models.Model):
   ...
   user = models.ForeignKey(User)

您可以使用以下方式获取与当前用户相关的所有联系人:

contact_ids = [each.id for each in request.user.contact_set.all()]

您可以获得该用户的所有未订阅联系人:

unsubscribed_contacts = Unsubscribe.objects.filter(content_type__name='contact', object_id__in=contact_ids)

答案 2 :(得分:2)

请记住,通用外键只是两个字段,一个是ContentType模型的ForeignKey,另一个是您指向的模型的主键。所以,为了更通用,你可以这样做:

content_type = ContentType.objects.get_for_model(User)
Unsubscribe.objects.filter(content_type=content_type, object_id=user.id)

答案 3 :(得分:0)

对于具有django较新版本的新问题,content_type__name只是一个属性,您不能对此进行查询。而是像这样在您的过滤器方法中使用content_type__model

Unsubscribe.objects.filter(content_type__model='user', user=request.user)