Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django过滤器多个关系_Python_Django_Django Models_Django Rest Framework_Orm - Fatal编程技术网

Python 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.

我花了很多时间试图过滤出与多对多相关的实体,但结果真的让我吃惊。我不明白如何解决这个问题以及为什么会发生这种情况

我在Django有两种型号:


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个实例