我的通知模型是通用的,这意味着它可以容纳任何对象。它看起来像这样:
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)
然而,两者都给我一个错误,我无法对通用内容类型对象进行反向关系查询。如何过滤或获取指向不存在的对象的所有通知?
答案 0 :(得分:1)
如您所见,无法在filter()
中使用通用外键。但是,由于您只想排除没有相关对象的对象,因此您可以在object_id
上进行过滤。
Notification.objects.filter(object_id__isnull=False)