Как объединить два связанных prefetch запроса в запросе Django
мне нужно сделать фильтр django со сложным запросом формы и у меня нет опыта работы с методами select_related и prefetch_related.
models.py:
class User(models.Model):
class Park(models.Model):
class Plot(models.Model):
owner = models.ForeignKey(get_user_model(), verbose_name=_('Owner'), on_delete=models.SET_NULL, null=True, related_name='plots')
park = models.ForeignKey('Park', verbose_name=_('Park'), on_delete=models.SET_NULL, null=True, related_name='plots')
class Building(models.Model):
plot = models.ForeignKey('Plot', verbose_name=_('Plot'), on_delete=models.SET_NULL, blank=True, null=True, related_name='plot_buildings')
owner = models.ForeignKey(get_user_model(), verbose_name=_('Owner'), on_delete=models.SET_NULL, blank=True, null=True, related_name='owner_buildings')
tenant = models.ForeignKey(get_user_model(), verbose_name=_('Tenant'), on_delete=models.SET_NULL, blank=True, null=True, related_name='tenant_buildings')
Мне нужно получить всех пользователей, которые являются владельцами участка или здания или арендаторами здания.
У меня пока есть это...
filters.py:
class UserApiFilter(filters.FilterSet):
park_id = filters.CharFilter(method='filter_by_park')
def filter_by_park(self, queryset, name, value):
params = {name: value}
result = queryset.prefetch_related(Prefetch('plots', queryset=app_models.Plot.objects.filter(**params)))
Кто-нибудь может помочь мне, пожалуйста? Заранее спасибо.
На данный момент у меня есть следующее решение:
params = {'park__id': value}
plots = app_models.Plot.objects.filter(**params)
users_plots = list(map(lambda x: x.owner, plots))
params = {'plot__park__id': value}
buildings = app_models.Building.objects.filter(**params)
users_buildings_owners = list(map(lambda x: x.owner, buildings))
users_buildings_tenats = list(map(lambda x: x.tenant, buildings))
result = list(map(lambda x: x.id, set(users_plots + users_buildings_owners + users_buildings_tenats)))
return queryset.filter(id__in=result)