2009-11-29 2 views
4

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

class Farm(models.Model): 
    name = ... 

class Tree(models.Model): 
    farm = models.ForeignKey(Farm) 

... и я получаю QuerySet из Tree объектов. Как определить, какие фермы представлены в этом QuerySet?

+0

By "уникальный" вы имеете в виду "отчетливый"? –

ответ

4

Там может быть лучший способ сделать это с Django ORM и держать его ленивым, но вы можете получить то, что вы хотите с регулярными питона (с верхней части моей головы):

>>> set([ t.farm for t in qs ]) 
+0

Это было то, что я собирался вставить. – Mez

+0

Это будет работать, так как я должен повторить их в любом случае позже. Благодарю. – magneticMonster

+0

Квадратные скобки здесь не нужны, вы можете использовать: 'set (t.farm для t в qs)' –

0

Вот является способ иметь базу данных сделать работу для вас:

farms = qs.values_list('farm', flat=True).distinct() 
#values_list() is new in Django 1.0 

возвращаемое значение должно оценить что-то вроде:

(<Farm instance 1>, <Farm instance5>) 

были фермами, которые будут иметь деревья в этом конкретном запросе.

Для всех хозяйств, которые имеют деревья, использовать qs = Tree.objects

Имейте в виду, что если вы добавляете order_by('some_other_column') то различны будут применяться к различным комбинациям «фермы» и «some_other_column», потому что другой столбец будет также в sql запрос для заказа. Я думаю, что это ограничение (а не намеченная функция) в api, это описано в documentation.

+0

, так что это может быть qs.values ​​('farm'). Distinct()? Это возвращает плоский список или qs или что? .. должен посмотреть в документах ... –

+1

Это даст вам ВСЕ фермы. Задайте вопрос о том, какие фермы связаны только с деревом qs. –

+2

Просто замените 'Tree.objects' на соответствующий набор запросов Tree, и он не даст вам всех ферм. –

Смежные вопросы