Django: SQL-запрос с отличной от модели функцией - PullRequest
3 голосов
/ 30 декабря 2011

Привет, люди Stackoverflow,

в моем текущем проекте, у меня следующая структура модели:

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 очень разные и только они только У меня общее имя учителя, поэтому я держу его в отдельных классах.Кроме того, в каждом проекте только 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 Project Преподаватель биологии г-жа X Физика г-н Y (-> математику Y следует игнорировать)

Как мне структурировать запрос Django?Я хотел бы сделать Project.objects.filter (student_id = user.pk) .values ​​('get_teacher_name'). Different (), но это невозможно.Есть ли решение для этого?

Спасибо за ваши предложения!

1 Ответ

3 голосов
/ 30 декабря 2011

Вы ищете values и annotate 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))
...