2013-06-06 1 views
0

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

class myObj1(models.Model): 
    myField1 = models.IntegerField()  


class myObj2(models.Model): 
    myLocalObj1 = models.ManyToManyField(myObj1)  

Кроме того, предположим, что у меня есть список уникальных myObj1s:

a = myObj1(myField=1) 
b = myObj1(myField=2) 
c = myObj1(myField=3) 
myTargetList = [a, b, c] 

Теперь я хотел бы написать запрос Django с использованием объектов Q таким образом, что он возвращает все myObj2s, которые имеют какой-либо член myTargetList как myLocalObj1. Кроме того, я заранее не знаю точный размер myTargetList.

Как мне это сделать? Это, очевидно, не будет работать:

myObj2.objects.filter(Q(myLocalObj1__in=myTargetList)) 

ответ

1

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

vallist=[] 
for b in myTargetList: 
    vallist.append(b.myField) 

myObj2.objects.filter(myLocalObj1__in=myObj1.objects.filter(myField__in=vallist)) 

Эта информация доступна в документации Django здесь: https://docs.djangoproject.com/en/dev/topics/db/queries/#lookups-that-span-relationships

+0

Это не сработало. Это недействительный синтаксис python. И даже если бы это было так, это не дает правильного ответа. –

+0

Хм, может быть, моя версия python немного отличается, используя 2.5, она отлично работала. Я отредактирую свой ответ и, возможно, получу что-то еще более подробно с тем, что вы ищете –