2011-03-30 51 views
0

我是新來的,使用Web Apps & SEO。 StackOverflow一直是學習我的Python方法的好資源& Django非常感謝社區。現在我的問題!比較Django中沒有F對象的兩個字段

我有一對夫婦的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 maxes時,預訂就會用盡。即達到其層級的enquiry_limit。

我發現有F對象這樣做的一個直接的方法和排除哪些工作得很好我的開發機器上:

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

提前感謝!

+0

最好不要跳過版本。 1.0到1.3是迄今爲止,有些在1.0中工作的東西在1.3中不起作用,因爲它們已被刪除(在1.1中預先棄用,在1.2中棄用,在1.3中刪除)。我認爲將消息存儲在帶有外鍵的模型中是auth.user中的一個,現在消息都是基於會話的。我也認爲你需要在1.3中使用csrf-token。這是在1.2 IIRC中添加的,並且我認爲在1.4中是強制性的。 – kaleissin 2011-03-30 11:57:47

回答

0

如果沒有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 
+0

感謝您的幫助!最後 - 我設法足夠平穩地升級,所以我可以使用F Objects。花了2天的測試,並做了調整,以處理1.0後引入的csrf保護。沒有足夠的代表投票了:) – crossan 2011-04-05 09:46:19

0

在查詢集插入自定義SQL使用extra(見其中/表):

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

例如(大致 - 你需要匹配SQL表名稱等)


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,使用該弄清楚要放什麼東西在你的電話額外