2010-04-12 2 views
3

У меня есть модель с внешним ключом к себе, как это:Джанго запроса для выбора родителя с ненулевыми детьми

class Concept(models.Model): 
    name = models.CharField(max_length=200) 
    category = models.ForeignKey('self') 

Но я не могу понять, как я могу выбрать все понятия, которые имеют ненулевое значение детей. Возможно ли это с помощью django QuerySet API или я должен написать собственный SQL?

ответ

3

Если я правильно понимаю, каждый Concept может иметь другую Concept как родитель, и это устанавливается в category поле.
Другими словами, Concept с хотя бы одним ребенком будет ссылаться хотя бы один раз в поле category.

Вообще говоря, это не так-то просто, чтобы попасть в Django; Однако, если вы не слишком много категорий, вы можете думать, для запроса т.п. SELECT * FROM CONCEPTS WHERE CONCEPTS.ID IN (SELECT CATEGORY FROM CONCEPTS); - и это то, что вы можете легко сопоставить с Django:

Concept.objects.filter(pk__in=Concept.objects.all().values('category')) 

Обратите внимание, что, как указано на Django documentation, этот запрос могут иметь проблемы с производительностью в определенных базах данных; поэтому вместо него вы должны поместить его в список:

Concept.objects.filter(id__in=list(Concept.objects.all().values('category'))) 

Но следует помнить, что это может ударить некоторые ограничения базы данных - например, Oracle позволяет до 1000 элементов в таких списках.

+0

Благодарим вас за глубокое объяснение! – dragoon

2

Как о чем-то вроде этого:

concepts = Concept.objects.exclude(category=None) 
+0

, но категория не является ничем для понятий без детей, ваш запрос предоставит неопубликованные концепции (концепция и категория по существу одинаковы) – dragoon

2

так, как вы его там написано потребуется значение для category. После того, как вы зафиксировали, что (с null=True в конструкторе поле), используйте:

Concept.objects.filter(category__isnull=False) 
Смежные вопросы