Сравните два поля в Django без объектов F - PullRequest
0 голосов
/ 30 марта 2011

Я новичок здесь, работаю с веб-приложениями и SEO. StackOverflow стал отличным ресурсом для изучения моего опыта работы с Python и Django, поэтому большое спасибо сообществу. Теперь на мой вопрос!

У меня есть пара моделей Django:

class Subscription(models.Model):
   hotel = models.ForeignKey("Hotel", related_name="subscriptions")
   tier = models.ForeignKey("Tier")
   enquiry_count = models.PositiveIntegerField(default=0)
   start_date = models.DateField(null=True, blank=True)
   end_date = models.DateField(null=True, blank=True)

и

class Tier(models.Model):
   name = models.CharField(max_length=32)
   enquiry_limit = models.PositiveIntegerField(default=0)

У меня также есть модель отеля, которую я покажу здесь в очень упрощенной форме:

class Hotel(models.Model):
   name = models.CharField("Hotel Name", max_length=128)
   address = models.TextField("Address", blank=True)
   town = models.CharField(max_length=64)
   star = models.PositiveIntegerField(default=0, null=True, blank=True)    

Каждый отель должен иметь подписку, чтобы появиться в моих результатах поиска. Каждая подписка имеет уровень с определенным пределом enquiry_limit. Подписка заканчивается, когда она либо достигает end_date, либо ее максимальное значение enquiry_count заканчивается. то есть достигает предела enquiry_limit своего уровня.

Я нашел простой способ сделать это с F Objects и исключение, которое хорошо работает на моей машине разработчика:

self.premium_hotels = Hotel.objects.select_related().exclude(
   Q(subscriptions__end_date__lte=datetime.date.today()) | Q(subscriptions__enquiry_count__gte=F('subscriptions__tier__enquiry_limit')))

Это не будет работать в реальной версии сайта, так как он работает под управлением Django 1.0. Любые советы о том, как выполнить этот запрос без объектов F?

Я понимаю, что очевидным решением является обновление, но нам нужно это сразу же развернуть, и мне потребуется время для подготовки и тестирования, прежде чем мы перейдем на Django 1.3

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 30 марта 2011

Используйте extra в наборе запросов для вставки пользовательского SQL (см. Где / таблицы):

http://docs.djangoproject.com/en/dev/ref/models/querysets/#extra

например. (примерно - вам нужно сопоставить имя таблицы и т. д. в SQL)

<code>
self.premium_hotels = Hotel.objects.select_related().exclude(
   Q(subscriptions__end_date__lte=datetime.date.today())).extra(tables=["myapp_tier"], where=['myapp_subscriptions.enquiry_count 

Лучше всего, чтобы ваш запрос выполнялся локально - посмотрите, какой SQL он генерирует, и используйте его, чтобы выяснить, что добавить в ваш вызов для дополнительных

0 голосов
/ 30 марта 2011

Без объектов F вы не сможете выполнить запрос за один шаг, ваш собственный вариант - запустить запрос, не глядя на enquiry_limit, и обработать список, чтобы удалить те отели, которые превысили его.

Должно работать что-то вроде приведенного ниже кода.

hotels = Hotel.objects.select_related().exclude(
    Q(subscriptions__end_date__lte=datetime.date.today()))

self.premium_hotels = []
for h in hotels:
    for sub in h.subscriptions.filter(start_date__lte=datetime.now(), end_date__gte=datetime.now()):
        if sub.enquiry_count < sub.tier.enquiry_limit:
            self.premium_hotels.append(h)
            break
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...