Django过滤器关联字段集

时间:2019-05-03 14:27:39

标签: python django python-3.x

我有两个模型,这是它的简化示例:

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)

但是我得到一个错误:

  

AttributeError位于/ api / applications / public / 79   无法在用于指定中介模型的ManyToManyField上设置值。使用application.ApplicationForm的Manager代替。

所以我的问题是可能的,如果可能的话我该怎么办?

1 个答案:

答案 0 :(得分:0)

您使用的是中介模型,您应该read this。如果您为其他字段提供默认值(在您的情况下为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())