Как объединить два связанных 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)
Вернуться на верх