5

我有一个模型,它指向一个通用关系。这可以是联系人对象或客户对象。

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

4 回答 4

5

你可以试试这个

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)
于 2013-07-08T13:26:43.087 回答
3

我假设你的模型是这样的:

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)
于 2013-07-08T13:51:50.247 回答
2

请记住,通用外键只是两个字段,一个是 ContentType 模型的 ForeignKey,另一个是您指向的任何模型的主键。因此,为了更通用,您可以执行以下操作:

content_type = ContentType.objects.get_for_model(User)
Unsubscribe.objects.filter(content_type=content_type, object_id=user.id)
于 2017-01-18T17:06:51.020 回答
2

对于有 django 较新版本的这个问题的新手来说,这content_type__name只是一个属性,你不能用它来查询。而是content_type__model像这样在您的过滤器方法中使用:

Unsubscribe.objects.filter(content_type__model='user', user=request.user)
于 2020-11-10T09:30:13.250 回答