Я написал несколько инструкций, чтобы извлечь данные из моей базы данных. У меня два значения; название города и ключевое слово, которые являются атрибутами 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
Спасибо.