次のモデル(簡略化)があります。警告モデルは、機会オブジェクト(他のタイプも含む)を含めることができる汎用外部キーです。
Occasion(models.Model):
start_date = models.DateField()
Warnings(models.Model):
status = models.CharField()
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
content_object = generic.GenericForeignKey('content_type', 'object_id')
警告がない機会を取得したいだけでなく、警告テーブルに status='new' がある機会を除外したいと考えています。このクエリはどのように記述すればよいですか?
編集:これは正しい結果を得るSQLです
select * from occasion left join warnings
on occasion.id = warnings.object_id
and warnings.content_type_id = 13 --type id for the model.
and warnings.status <> 'new';
もう一度編集:
これが私がそれを解決した方法です:
#First get any occasions with status='new' from warnings
ctype = ContentType.objects.get(app_name="myapp", model="ocassion")
warnings = warning.objects.filter(content_type=ctype, status='new')
#Filter out only object_ids
warning_occasion_list = set(list(warnings.values_list('object_id', flat=True))
#Then exclude these from the occasion query
occasions = occasion.objects.all().exclude(occasion_id__in=warning_occasion_list)