为查询集和对象提供单过滤器功能

时间:2017-03-20 20:31:06

标签: django

我有一个Django 1.10项目。假设我有一个这样的模型:

class Student(models.Model):
    university = models.ForeignKey(University, ...)
    objects = CustomQuerySetManager()

    class QuerySet(QuerySet):
       def university_rating(self, level): 
          return self.filter(university__rating = level)

class University(models.Model):
    rating = IntegerField(...)

因此,如果我们想按大学评分筛选学生,我们会使用Student.objects.univesity_rating(5)代替Student.objects.filter(university__rating = level隐藏视图代码中的模型逻辑。这种方法非常干燥,因为如果我决定改变我的模型结构,以便它影响我们根据大学评级筛选学生的方式,我们将不得不在一个地方进行修改,而不是在我们的头上撕掉头发替换整个片段整个项目。

但是!

以上代码仅适用于QUERYSETS,不适用于MODELS INSTANCES。也就是说,让我们说(无论多么无瑕,只是让我们想象一下作为说明性的例子),学生姓和他的大学水平唯一地定义了学生 - 如果有这样的学生。

所以我想做点什么:

try:
    student = Stundent.objects.get(surname = ..., university__rating = level)
except Student.DoesNotExist:
    ...

问题是我的自定义过滤器在这种情况下没有帮助我,我没有出路,只能在我的视图代码中明确写出university__rating短语。是否有任何优雅的方法来提出一个Django结构,可以实现对实例和查询集的过滤?

1 个答案:

答案 0 :(得分:1)

您可以在查询集上使用.get,因此:

try:
    student = Stundent.objects.univesity_rating(level).get(surname = ...)
except Student.DoesNotExist:
    ...