2016-11-22 2 views
-1

Если у меня есть список идентификаторов для фильтрации, как я могу сгенерировать запрос? Например:Как сгенерировать запрос в Django?

[14, 44] приведет query.filter(tags__tag_id=14).filter(tags__tag_id=44)

>>> print(Place.objects.filter(tags__tag_id=14).filter(tags__tag_id=44).query) 

SELECT "places_place"."id", "places_place"."address" 
FROM "places_place" 
INNER JOIN "places_placetag" 
ON ("places_place"."id" = "places_placetag"."place_id") 
INNER JOIN "places_placetag" 
T4 ON ("places_place"."id" = T4."place_id") 
WHERE ("places_placetag"."tag_id" = 14 AND T4."tag_id" = 44) 

(я не знаю, что T4 в приведенном выше SQL является, но независимо от того, это другой вопрос)

У меня есть Hacky решение в виду, но это так наивно и хреново выглядящих, должен быть лучший способ сделать это:

tag_ids = [14, 44] 

query_string = 'Place.objects' 
for tag_id in tag_ids: 
    query_string += ('.filter(tags___tag_id=' + str(tag_id)) 

query = eval(query_string) 

class Place(models.Model): 
    address = models.CharField(max_length=123) 

class PlaceTag(models.Model): 
    place = models.ForeignKey('Place', models.CASCADE, 'tags') 
    tag = models.ForeignKey('Tag', models.CASCADE, 'places') 

class Tag(models.Model): 
    tag = models.CharField(max_length=254) 

ответ

1

Это делает то, что вы хотите?

tag_ids = [11, 22, 33] # Place must have all of these tags 
query = Place.objects.all() 
for tag_id in tag_ids: 
    query = query.filter(tags___tag_id=tag_id) 

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

  • Нет связанных вопросов^_^