2011-03-30 55 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,使用该弄清楚要放什么东西在你的电话额外