1

私はDjango 1.6を使用しており、次のモデルがあります(読みやすくするために少し簡略化されています):

class Person(models.Model):
    name = models.CharField(max_length=128)

class Room(models.Model):
    max_persons = models.SmallIntegerField()
    name = models.CharField(max_length=30, unique=True)

class Stay(models.Model):
    person = models.ForeignKey(Person)
    STAY_TYPE = (
        (1, 'Type 1'),
        (2, 'Type 2'),
        (3, 'Type 3'),
    )
    stay_type = models.CharField(max_length=1, choices=STAY_TYPE)

class Hospitalization(models.Model):
    stay = models.ForeignKey(Stay)
    date_in = models.DateField()
    date_out = models.DateField(blank=True, null=True)
    room = models.ForeignKey(Room)

(querysetマネージャーで) を使用して、特定の日付に利用可能なすべての部屋を取得したいと思います。つまり、max_persons満たされていない場所です。

これまでのところ、Qいろいろいじってみましたが、比較Room.objects.filter(hospitalization__date_out__lt="2014-04-25")がわかりません。max_persons

アイデアはありますか?

編集

各部屋に関連する Person オブジェクトの数は、その部屋の人数を表しています。

したがって、以下のカールの提案に従って、私は遊んでみました:

  • Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=hospitalization_set__stay__person.Count()).exclude(num_persons__lte=max_persons)
    • 収量NameError: name 'hospitalization_set__stay__person' is not defined
  • Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=Count('hospitalization_set__stay__person')).exclude(num_persons__lte=max_persons)
    • 収量FieldError: Cannot resolve keyword 'hospitalization_set' into field.
  • Room.objects.filter(hospitalization__date_out__lte="2014-04-25").annotate(num_persons=Count('hospitalization__stay__person')).exclude(num_persons__lte=F('max_persons'))
    • []現在の DB によると、少なくとも 3 つの結果が期待されますが、何も得られません ( )。
    • を削除.exclude()しても、まだ結果が得られません。.annotate()私が使っているのは何か間違っているようです。
4

1 に答える 1

1

Room.objects.filter(hospitalization__date_out="2014-04-25", max_persons__lt=x)に似たものがうまくいくはずだと私は信じています。1 つのフィルター操作で複数の宣言を使用できること、および除外とフィルターの両方を連鎖させることもできることに注意してください。これはデータベース アクティビティに追加されません。querysetフィルターなどは、querysetそれ自体が評価されるときにのみ実行されます。クエリの作成については、The Django Docs を参照してください。

編集: これは実際には最初に考えたよりも少し複雑であることが判明しましたが、(モデル宣言をインポートしてシェルセッションを行った後)解決したと思います!

rooms = Room.objects.filter(DATE FILTERING HERE).annotate(num_persons=Count('hospitalization__room__id')).filter(num_persons__lt=F('max_persons')).count()

num_persons(上記の注釈付き変数) が より小さい部屋の数を示しますmax_persons。事前に日付のフィルタリングが行われます。

必要なインポートを忘れずに含めてください。 from django.db.models import Count from django.db.models import F

于 2014-04-19T15:30:12.033 に答える