фильтр с select_related на Django

У меня проблема с использованием select_related функции Django с операцией фильтра, вот моя проблема, у меня есть три класса:

class A:
   # various fields here

class B(models.model):
   related_A = models.ForeignKey(A)
   related_C = models.ForeignKey(C)
   attribute1 = models.CharField(..)
   # Other attributes

class C(models.model):
   # Attributes

Я пытаюсь получить класс A путем фильтрации класса B по ключу related_C в соответствии с другим параметром attribute1 (из класса B). Чтобы проиллюстрировать это должным образом, у меня есть функция get_class_A(self) в моем классе C.

get_class_A(self,param):
   classes_B = B.objects.filter(related_C = self,attribute1 = param)

Он возвращает QuerySet классов B. Что я хочу сделать, так это следовать за ForeignKey, указывающим на A, чтобы преобразовать этот QuerySet из B в список объектов A.

Я пробовал разные вещи, такие как:

classes_A = B.objects.select_related('A').filter(related_C = self, attribute1 = param)

и некоторые варианты, но ничего не получилось. Кто-нибудь знает, как это сделать?

Спасибо


person Kobz    schedule 27.02.2014    source источник


Ответы (1)


def get_class_A(self, param):
    return A.objects.filter(b__related_c=self, b__attribute1=param).distinct()

То, что вы описали, очень похоже на отношение ManyToMany между A и C. Если вы объявите его как таковое и включите дополнительные attributes, указав B как через модель, Django создаст для вас отношения между A и C.

Кроме того, select_related() не имеет ничего общего с фильтрацией результатов, это всего лишь инструмент, позволяющий сократить количество запросов к базе данных. Из документов:

Это ускоритель производительности, который приводит к одному более сложному запросу, но означает, что последующее использование отношений внешнего ключа не потребует запросов к базе данных.

person Kevin Christopher Henry    schedule 27.02.2014
comment
Вот и все, я пытаюсь создать отношение ManyToMany, но с дополнительными аргументами. Я не знал, что вы можете добавить какой-то дополнительный атрибут со сквозной моделью. Попробую так, думаю будет проще. Спасибо ! - person Kobz; 27.02.2014
comment
comment
Я это сделаю. Я начал использовать django не полностью «неоптимизированным» способом (добавляя запросы, которые не были необходимы), и теперь я пытаюсь сделать чистый код, используя как можно больше функций Django, и есть некоторые концепции, которые я не осваиваю. пока что. Спасибо за помощь, вы мне очень помогли :) - person Kobz; 27.02.2014