我有一个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结构,可以实现对实例和查询集的过滤?
答案 0 :(得分:1)
您可以在查询集上使用.get
,因此:
try:
student = Stundent.objects.univesity_rating(level).get(surname = ...)
except Student.DoesNotExist:
...