Объект Queryset Many to many 'ManyRelatedManager' не является итерируемым
Я использую формы для фильтрации вариантов отношений "многие ко многим", чтобы показать только те, которые следуют за набором запросов. Вот как выглядит моя форма
class ContractAdminForm(forms.ModelForm):
class Meta:
model = Contract
fields = '__all__'
def __init__(self, *args, **kwargs):
super(ContractAdminForm, self).__init__(*args, **kwargs)
self.fields['client_year_periods'].queryset =ClientYearPeriod.objects.filter(
Q(contract_id__isnull=True) | Q(contract_id=self.instance.id) &
Q(client__in=self.instance.client_entity.all()))
Ошибка: объект 'ManyRelatedManager' не является итерируемым.
Проблема вызвана
Q(client__in=self.instance.client_entity))
Мне нужно фильтровать годы модели, используя юридическую модель клиента, которая подключена к Client Ops.
Смотрите здесь, как он построен
Модели
class ClientEntity(models.Model):
name = models.CharField(max_length=350, verbose_name='Client Name')
countries = models.ManyToManyField(Country, blank=True)
operations_code = models.ManyToManyField(Client)
class ClientYearPeriod(models.Model):
client = models.ForeignKey(Client, on_delete=models.PROTECT, null=True)
[...]
class Contract (models.Model):
client_entity= models.ManyToManyField(ClientLegal)
client_year_periods = models.ManyToManyField(ClientYearPeriod, blank=True)
[...]
class Client(models.Model):
code = models.CharField(max_length=3, verbose_name='Client Code')
name = models.CharField(max_length=250, unique=True)
Ожидаемый результат
В этом контракте выбран клиент Someone
В модели сущности клиента она связана с Client = BEM
Здесь должны быть показаны только те, которые выбрал Клиент: BEM После сохранения (не при создании контракта, так как клиент, выбранный выше, еще не сохранен)
client__in=…
ожидает QuerySet
, self.instance.client_entity
является менеджером, а не QuerySet
.
Но вам нужно сделать QuerySet
из Client
, поэтому:
class ContractAdminForm(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['client_year_periods'].queryset = ClientYearPeriod.objects.filter(
Q(contract_id__isnull=True) |
Q(contract_id=self.instance.id) &
Q(client__in=Client.objects.filter(cliententity__contract=self.instance).distinct())
)
class Meta:
model = Contract
fields = '__all__'