过滤具有空通用内容的对象

时间:2016-11-18 23:23:47

标签: django

我的通知模型是通用的,这意味着它可以容纳任何对象。它看起来像这样:

class Notification(models.Model):
    receiver = models.ForeignKey(User, related_name='notifications')
    sender = models.ForeignKey(User, related_name='sent_notifications', blank=True, null=True)

    object_type = models.ForeignKey(ContentType, blank=True, null=True)
    object_id = models.PositiveIntegerField(blank=True, null=True)
    object = GenericForeignKey('object_type', 'object_id')

    type = models.CharField(max_length=3, choices=config.NOTIFICATION_TYPE_OPTIONS)
    unread = models.BooleanField(default=True)

    slug = models.SlugField(max_length=255, unique=False, default='notification')

    # Other
    date_created = models.DateTimeField(auto_now=False, auto_now_add=True, blank=True)
    date_modified = models.DateTimeField(auto_now=True, auto_now_add=False, blank=True)

每当用户删除与通知相关的对象时,它最终都会指向NoneType对象。我想过滤掉与用户无关的通知。

我已经尝试过了:

Notification.objects.exclude(object=None)

Notification.objects.filter(object=None)

然而,两者都给我一个错误,我无法对通用内容类型对象进行反向关系查询。如何过滤或获取指向不存在的对象的所有通知?

1 个答案:

答案 0 :(得分:1)

如您所见,无法在filter()中使用通用外键。但是,由于您只想排除没有相关对象的对象,因此您可以在object_id上进行过滤。

Notification.objects.filter(object_id__isnull=False)