2015-01-23 2 views
0

Я написал несколько инструкций, чтобы извлечь данные из моей базы данных. У меня два значения; название города и ключевое слово, которые являются атрибутами Address и Museum:Рефакторинг Django query

class Museum(models.Model): 
    id = models.AutoField(primary_key=True) 
    name = models.CharField(max_length=200) 
    address = models.ForeignKey(Address) 
    description = models.CharField(max_length=200) 

class Address(models.Model): 
    id = models.AutoField(primary_key=True) 
    streetAddress = models.CharField(max_length=200) 
    city = models.CharField(max_length=200) 

Теперь я получаю два дополнительных параметров: город и и ключевое слово. Я хочу, чтобы отфильтровать музеи по такому городу (точное совпадение) И такого ключевого слова (частичное совпадение в названии ИЛИ описание)

Это то, что я в конечном итоге написание:

if city is not None and keyword is None: 
    city_data = Address.objects.all().filter(city=city) 
    museum_list = Museum.objects.all().filter(address__in=city_data) 

elif city is None and keyword is not None: 
    museum_list = Museum.objects.all().filter(
     Q(name__contains=keyword) | Q(description__contains=keyword) 
    ) 

elif city is not None and keyword is not None:  
    city_data = Address.objects.all().filter(city=city) 
    museum_list = Museum.objects.all().filter(
     Q(address__in=city_data) & (
      Q(name__contains = keyword) | Q(description__contains=keyword) 
     ) 
    ) 
else: 
    museum_list = Museum.objects.all() 

Я дону «Мне нравится этот код, потому что я учитываю все возможные комбинации. Как я могу использовать фильтрацию Django для улучшения такого кода:

results = Museum.objects.all() 
if city not null 
    results = results.filterByAddress_City 
if keyword not null 
    results = results.filterByKeywordLikeNameOrLikeDescription 

Спасибо.

ответ

2

Запросы являются составными, поэтому вы можете в значительной степени выполнять то, что вы указываете в своем псевдокоде.

results = Museum.objects.all() 
if city: 
    results = results.filter(address__city=city) 
if keyword: 
    results = results.filter(Q(name__contains = keyword) | Q(description__contains = keyword))