Python Django过滤器多个关系
我花了很多时间试图过滤出与多对多相关的实体,但结果真的让我吃惊。我不明白如何解决这个问题以及为什么会发生这种情况 我在Django有两种型号:Python Django过滤器多个关系,python,django,django-models,django-rest-framework,orm,Python,Django,Django Models,Django Rest Framework,Orm,我花了很多时间试图过滤出与多对多相关的实体,但结果真的让我吃惊。我不明白如何解决这个问题以及为什么会发生这种情况 我在Django有两种型号: class Application(models.Model): ... forms = models.ManyToManyField(Form, related_name='applications', through='ApplicationForm', blank=True) ... class Form(models.
class Application(models.Model):
...
forms = models.ManyToManyField(Form, related_name='applications', through='ApplicationForm', blank=True)
...
class Form(models.Model):
...
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)
在ApplicationSerializer中,我想返回与我的应用程序相关的筛选表单。我试着这样做:
forms = serializer.SerializerMethodField()
def get_forms(self, obj):
qs = obj.forms.filter(status=Form.COMPLETED)
return FormSerializer(qs, many=True, context=self.context).data
我有两份表格和三份申请表,两份表格都有。但是我的函数返回6种形式[1,2,1,2,1,2]。
我尝试对此进行调试,发现obj.forms.all()
返回2个表单,但如果添加过滤器,则返回6个表单。我尝试使用obj.forms.filter(status=Form.COMPLETED).distinct()
,但结果相同
我不能像
Forms.objects.filter(status=Form.COMPLETED).filter(pk\uu in=…)
那样创建查询,因为我在应用程序管理器级别预取和注释了许多参数。所以我想知道是否有任何方法可以过滤与我的实例相关的许多关系对象,如果您的问题只是向用户显示数据,那么您可以处理这个问题
在to_表示方法中。并修改您想要更改的数据
def to_representation(self, instance: Application):
data = super().to_representation(instance)
qs = obj.forms.filter(status=Form.COMPLETED)
data['forms'] = FormSerializer(qs, many=True, context=self.context).data
return data
不,我在表示方面没有问题,主要问题是
obj.forms.filter(status=Form.COMPLETED)
返回4个实例,而不是2个实例