我有两个模型,这是它的简化示例:
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代替。
所以我的问题是可能的,如果可能的话我该怎么办?
答案 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())