2016-06-13 3 views
-1

У меня есть две моделиDjango присоединиться как запросы

class A(models.Model): 
    id = PGUUIDField(primary_key=True) 
    name = CharField(max_length=32) 
    prefix = CharField(max_length=64) 
    controller = models.ForeignKey(Controller) 
    location = models.ForeignKey(B, related_name="blink") 

class B(models.Model): 
    id = PGUUIDField(primary_key=True) 
    name = CharField(max_length=128) 

В таблице для А содержит множество объектов А и таблица B содержит множество B объектов.

Использование сырой SQL я могу ...

SELECT b.* FROM B AS b 
JOIN A AS a 
ON b.id = a.location_id 

И я получить список всех объектов В, что А имеет внешний ключ.

Но я не могу на всю жизнь понять, как это сделать с чистым Django. Не могли бы вы рассказать мне, как?

Я искал select_related и попробовал, но я должен делать что-то неправильно. Я продолжаю получать QuerySet А объекты

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

queryset2 = [] 
    try: 
     qs = A.objects.all().values('location_id') 
     queryset2 = B.objects.filter(id__in=qs) 
     print queryset2 
     self.fields['location'].queryset = queryset2 
+1

Это описано в [Часть 2 учебника] (https://docs.djangoproject.com/en/1.9/intro/tutorial02/). –

+0

queryset2 = B.objects.filter (id = a__location_id) --returns --global name 'a__location_id' не определен ()
Я предполагаю, что вы ссылались на этот «Choice.objects.filter» (question__pub_date__year = current_year) "в учебнике –

+0

Нет, я не имею в виду это. Вы также не делаете то, что они делают в учебнике. Обратите внимание, что синтаксис двойного подчеркивания относится к _name аргумента_, а не к самому аргументу. Вот почему вы получаете ошибку имени, потому что ссылаетесь на переменную с именем 'a__location_id', которую вы никогда не определяли. –

ответ

0

Пока вы читаете вверх на tutorial, это должно, что вы хотите:

B.objects.prefetch_related('blink').all() 

Больше на writing queries

+0

Это возвращает список всех объектов B.Не только те, что A имеет внешний ключ для –

+0

Каждый из объектов 'B' связан с объектами' A', к которым можно получить доступ: 'b.blink' –

+0

Спасибо, но я должен задать еще одну вещь. Как получить набор запросов только связанных элементов? –

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