次のモデルがあるとしましょう。
class House(models.Model):
address = models.CharField(max_length=255)
class Person(models.Model):
name = models.CharField(max_length=50)
home = models.ForeignKey(House, null=True, related_name='tenants')
class Car(models.Model):
make = models.CharField(max_length=50)
owner = models.ForeignKey(Person)
取得する必要があるとしましょう(奇妙なものですが):
- 家に住んでいるか、「ジョン」という名前の人のリスト
- 上記の人の車のリスト
私は2つの機能を持ちたいです:
get_tenants_or_johns(house)
get_cars_of_tenants_or_johns(house)
私はそれらを次のように定義することができます:
from django.db.models.query_utils import Q
def get_cars_of_tenants_or_johns(house):
is_john = Q(owner__in=Person.objects.filter(name='John'))
is_tenant = Q(owner__in=house.tenants.all())
return Car.filter(is_john | is_tenant)
def get_tenants_or_johns(house):
johns = Person.objects.filter(name='John')
tenants = house.tenants.all()
return set(johns) | set(tenants)
問題は、上記の例でロジックが繰り返されていることです。get_tenants_or_johns(house)
私が返すことができれば、queryset
私は次のように定義することができますget_cars_of_tenants_or_johns(house)
:
def get_cars_of_tenants_or_johns(house):
return Car.objects.filter(owner__in=get_tenants_or_johns(house))
これを行うには、get_tenants_or_johns(house)
クエリセットを他のコレクションに変換せずに、クエリセットの和集合を返す必要があります。
get_tenants_or_johns(house)
SQLを含むクエリセットを返すように実装する方法がわかりませんUNION
。それを行う方法はありますか?そうでない場合、私がやろうとしていることを達成するための別の方法はありますか?