Django filter deep related models
В моем приложении Django 3.2 мои модели имеют следующие отношения:
OperationDraft -> ForeignKey(Structure)
Structure -> ForeignKey(Customer)
Customer -> OneToOne(AUTH_USER_MODEL)
Теперь, когда я создаю новую OperationDrat, я должен ограничить выбор структуры на основе пользователя ее клиента. Если пользователь не активен, то я не могу выбрать структуру.
Для этого я переопределил formfield_for_foreignkey в классе OperationDraftAdmin:
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Override formfield_for_foreignkey."""
if db_field.name == "structure":
# this doesn't work
kwargs["queryset"] = Structure.objects.filter(customer__user__is_active=True)
# this returns 0 results even if we have a customer with such user
# kwargs["queryset"] = Structure.objects.filter(customer__user__username="user480")
return super().formfield_for_foreignkey(db_field, request, **kwargs)
Фильтр должен быть:
kwargs["queryset"] = Structure.objects.filter(customer__user__is_active=True)
Но он возвращает все структуры, даже те, в которых клиент связан с неактивным пользователем.
URL: /operations/operationdraft/add/ Мои модели (ограниченные соответствующим кодом):
@admin.register(OperationDraft)
class OperationDraftAdmin(OperationProxyAdmin):
"""Set OperationDraft Admin."""
def formfield_for_foreignkey(self, db_field, request, **kwargs):
"""Override formfield_for_foreignkey."""
if db_field.name == "structure":
# this doesn't work
kwargs["queryset"] = Structure.objects.filter(customer__user__is_active=True)
# this returns 0 results even if we have a customer with such user
# kwargs["queryset"] = Structure.objects.filter(customer__user__username="user480")
# this works but it's not what I need
# kwargs["queryset"] = Structure.objects.filter(customer__name="Customer249")
return super().formfield_for_foreignkey(db_field, request, **kwargs)
class Operation(models.Model, StatusLogMixin):
structure = models.ForeignKey(
Structure,
verbose_name="struttura",
related_name="operations",
on_delete=models.PROTECT,
)
class OperationDraft(Operation):
"""Define draft operation proxy model."""
class Meta:
"""Define model Meta."""
proxy = True
verbose_name = "Intervento in bozza"
verbose_name_plural = "01 - Inserimento Interventi"
class Customer(models.Model):
"""Customer model."""
user = models.OneToOneField(
settings.AUTH_USER_MODEL,
verbose_name="utente web",
on_delete=models.SET_NULL,
related_name="customer",
blank=True,
null=True,
limit_choices_to={"groups__name": settings.CUSTOMER},
)
class Structure(models.Model):
"""Model of the Structure."""
customer = models.ForeignKey(
Customer,
verbose_name="cliente",
related_name="structures",
on_delete=models.PROTECT,
)
Я проверил документацию и мне кажется, что мой запрос правильный, но не работает.
Что я делаю не так?