Django фильтр многозначного отношения - PullRequest
0 голосов
/ 05 марта 2020

Я потратил много времени, пытаясь отфильтровать сущности, связанные со многими, но результат меня действительно поражает. Я не могу понять, как решить эту проблему и почему это происходит.

У меня есть 2 модели в 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

У меня есть 2 формы и 3 приложения, которые имеют обе формы. Но моя функция возвращает 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__in=...) потому что у меня есть много параметров, предварительно выбранных и аннотированных на уровне менеджера приложений. Поэтому я хочу знать, есть ли способ отфильтровать множество объектов отношений, связанных с моим экземпляром

1 Ответ

0 голосов
/ 07 марта 2020

если ваша проблема только в том, чтобы показать данные пользователю, вы можете обработать это в методе to_represnataion. и измените данные, которые вы хотите изменить.

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