2011-12-30 38 views
3

嗨#1人,Django的:SQL查询与模型函数不同

在我的当前项目

,我有以下的模型结构:

class Project(models.Model): 
    student_id = models.ForeignKey(User) 
    class_a = models.ForeignKey(ClassA) 
    class_b = models.ForeignKey(ClassB) 
    ... 

class ClassA(models.Model): 
    teacher_name = models.CharField(...) 

class ClassB(models.Model): 
    teacher_name = models.CharField(...) 

ClassA和ClassB的有很大的不同,只有他们才有共同的teacher_name,因此我将它保存在单独的类中。 另外,在每个项目中只有class_a class_b可以包含一个ForeignKey(它不能被分配给两个类)。

当我显示所有的项目,我想列出老师的名字,所以我创建了一个小模型函数,该函数返回老师的名字:

def get_teacher_name(self): 
    if self.class_a: 
     return self.class_a.teacher_name 
    if self.class_b: 
     return self.class_b.teacher_name 

现在,我想编写一个查询其返回教师的名字为student_id数据,只返回老师的名字一次,如: 对于学生X 项目教师 生物学X夫人 物理Y先生 ( - >数学Y先生应该被忽视)

我应该如何构造Django查询?我想做 Project.objects.filter(student_id = user.pk).values('get_teacher_name')。distinct(),但这是不可能的。有没有解决方案?

谢谢您的建议!

回答

3

而你却被寻找valuesannotate https://docs.djangoproject.com/en/dev/topics/db/aggregation/#order-of-annotate-and-values-clauses

,这将给你唯一值的值调用。

import itertools 

class_a_names = user.project_set.values_list('class_a__teacher_name', flat=True).annotate() 
class_b_names = user.project_set.values_list('class_b__teacher_name', flat=True).annotate() 
unique_teachers = set(itertools.chain(class_a_names, class_b_names)) 
+0

谢谢你的回答。你能解释一下project_set的来源吗?谢谢! – neurix 2011-12-30 02:25:43

+0

@neurix - 如果你有一个'ForeignKey'从项目到'User',django以'class_set'的形式添加反向相关的模型管理器,除非你在'ForeignKey'字段中指定了'related_name'参数。 https://docs.djangoproject.com/zh/dev/topics/db/queries/#following-relationships-backward – 2011-12-30 02:40:09

+0

有没有办法将老师的pk保留在列表中?我尝试过('class_a_teacher__name','class_a_teacher__pk'),但找不到pk。感谢您的帮助! – neurix 2011-12-30 02:40:39