0

visible以下の関数の2つのカウントクエリを1つのクエリにマージしようとしています。リレーションがない場合、またはリレーションがあり、特定のフィルタリングがtrueの場合、関数はTrueを返す必要があります。

class OtherModel(models.Model):
    starts = models.DateField()
    ends = models.DateField()

class MyModel(models.Model):

    m2m = models.ManyToManyField('OtherModel', blank=True, )

    def visible(self):
        # Should always return True if no relations to OtherModel are present.

        if self.m2m.exists(): 
            # If relations to OtherModel are present check for starts and ends.
            # The reason for the first check is that if there are no relations
            # and the below query returns 0 the function will return False 
            today = datetime.date.today()
            return self.m2m.filter(starts__lte=today, ends__gte=today).exists()
        return True

編集:より多くのコードとコメント、countをexistsに置き換えました。

m2m関係は日付制限用ですが、日付制限が使用できない場合、関数はTrueを返す必要があります(制限がまったくない場合はオブジェクトが表示されますが、制限が存在するが現在の日付と一致しない場合は表示されません)。

サンプルコードは単純化された例です。これを実行し、実際にクエリセットも返す必要があります。

4

2 に答える 2

3

Qと集計で解決しました。Aamirにexists()をありがとう:

def visible(self):
    today = datetime.date.today()
    return MyModel.objects.annotate(num_m2m=Count('m2m')).filter(
            Q(pk=self.pk) &
            (
                Q(m2m__starts__lte=today) &
                Q(m2m__ends__gte=today) |
                Q(num_m2m=0)
            )
    ).exists()
于 2013-01-10T08:13:04.247 に答える
1

実際の要件が正確にわからないが、self.m2m.count() > 0余分なチェックを避け、関数からブール値が存在するかどうかを返したいと思う場合は、 QuerySetに結果が含まれている場合と含まれていない場合に返される.existsが必要です。 :TrueFalse

def visible(self):
    # return True or False
    return self.m2m.filter(some_filter=some_value).exists()
于 2013-01-09T13:29:41.237 に答える