2011-03-30 5 views
0

저는 Web Apps & SEO로 일하고 있습니다. StackOverflow는 파이썬에서 제 길을 배우는 데있어 훌륭한 자료였습니다 & 장고는 커뮤니티에 큰 감사를드립니다. 이제 내 질문에!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 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)  
:

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

가 나는 또한 내가 매우 simlified 형태로 여기에 보여주지 호텔 모델이

나는 장고 모델의 몇 가지있다

각 호텔마다 내 검색 결과에 구독이 있어야합니다. 각 구독에는 특정 enquiry_limit가있는 계층이 있습니다. end_date에 도달하거나 enquiry_count가 초과되면 구독이 부족합니다. 즉 해당 계층의 enquiry_limit에 도달합니다.

나는 F 개체로이 일을하는 간단한 방법을 발견하고 내 dev에 컴퓨터에서 잘 작동하는 제외 : 그것은 장고를 작동하고 있기 때문에 이는 그러나 사이트의 라이브 버전에서 작동하지 않습니다

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'))) 

1.0. F 개체없이이 쿼리를 수행하는 방법에 대한 팁?

나는 확실한 솔루션을 업그레이드하는 것을 깨닫게하지만 우리는 이것이 바로 출시가 필요하고 우리가 사전에 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

답변

0

F 개체가 없으면 한 번에 쿼리를 수행 할 수 없으며 자신의 옵션은 enquiry_limit을 보지 않고 쿼리를 실행하고 포스트가 목록을 처리하여 초과 한 호텔을 제거합니다.

다음 코드와 같은 것이 작동합니다.

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

예 :

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를 사용할 수있을 정도로 부드럽게 업그레이드 할 수있었습니다. 1.0 이후에 도입 된 csrf 보호를 다루기 위해 솔리드 2 일 테스트 및 비틀기를했습니다. 투표에 충분한 인원이 없다 :) – crossan

0

사용자 정의 SQL을 삽입하는 검색어 세트에 대한 사용 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에서 테이블 이름 등과 일치해야합니다) 추가

관련 문제