Набор полей отношения фильтра Django - PullRequest
0 голосов
/ 03 мая 2019

У меня есть две модели, вот упрощенный пример:

class Application(TimestampedModel):
    ...
    forms = models.ManyToManyField(Form, related_name='applications', through='ApplicationForm', blank=True)


class ApplicationForm(models.Model):
    application = models.ForeignKey(Application, on_delete=models.CASCADE)
    form = models.ForeignKey(Form, on_delete=models.CASCADE)
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        ordering = ['-created_at']

Я хочу отфильтровать поле forms в модели приложения. Я пытаюсь сделать это:

queryset = Application.objects.get_active().filter(is_public=True, pk=self.kwargs['pk'])
for application in queryset:
    forms = application.forms.filter(form_sections__form_fields__pk__in=application.public_form_fields.all())
    application.forms.set(forms)

Но я получаю ошибку:

Ошибка атрибута в / api / application / public / 79 Невозможно установить значения для ManyToManyField, в котором указана промежуточная модель. Вместо этого используйте приложения. Приложение AppForm's Manager.

Итак, мой вопрос, возможно ли, и если возможно, как я могу это сделать?

1 Ответ

0 голосов
/ 03 мая 2019

Вы используете промежуточную модель, вам следует прочитать это .Вы можете использовать set(), только если вы указали значения по умолчанию для дополнительных полей (в вашем случае created_at).В противном случае вам придется создавать ApplicationForm объекты самостоятельно.

Так что это, вероятно, будет работать в Django 2.2:

application.forms.set(forms, through_defaults={'created_at': timezone.now()})

В более ранних версиях Django вам нужно пройти промежуточную модель:

application.forms.clear()  # remove all existing relations
for form in forms:
    ApplicationForm.objects.create(application=application, form=form, created_at=timezone.now())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...