如何在seralizers django rest框架中过滤外键?

时间:2020-10-13 12:26:16

标签: python django django-rest-framework

我的问题是如何在序列化程序中过滤外键?

首先,让我们看一下我的代码,然后我将向您详细解释一切!

models.py

class Project(models.Model):
    id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
    user = models.BigIntegerField()
    program = models.ForeignKey(Program, on_delete=models.CASCADE)

    class Meta:
        ordering = ['-id']


    def __str__(self):
        return self.name

class Sprint(models.Model):
    id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
    user = models.BigIntegerField()
    project = models.ForeignKey(Project, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)
    
    def __str__(self):
        return f"{self.name}"

class Backlog(models.Model):
    id = models.UUIDField(default=uuid4, primary_key=True, editable=False)
    ......
    as_a = models.ForeignKey(Persona, on_delete=models.CASCADE)
    sprint = models.ForeignKey(Sprint, on_delete=models.CASCADE)
    
    def __str__(self):
        return f"{self.name}"

serializers.py

class ProjectSerializer(serializers.ModelSerializer):
    date_created = serializers.SerializerMethodField()

    class Meta:
        model = Project
        fields = "__all__"
        read_only_fields = ("id", "user", "program", "date_created",)

    def get_date_created(self, instance):
        return timesince(instance.date_created)

class SprintSerializer(serializers.ModelSerializer):
    date_created = serializers.SerializerMethodField()

    class Meta:
        model = Sprint
        fields = "__all__"
        read_only_fields = ("id", "user", "date_created", "project",)

    def get_date_created(self, instance):
        return timesince(instance.date_created)

class BacklogSerializer(serializers.ModelSerializer):
    date_created = serializers.SerializerMethodField()
    project = ProjectSerializer(read_only=True)

    class Meta:
        model = Backlog
        fields = "__all__"
        read_only_fields = ("id", "user", "date_created", "project",)

    def get_date_created(self, instance):
        return timesince(instance.date_created)

views.py

class BacklogAPIView(ListCreateAPIView):
    serializer_class = BacklogSerializer

    def get_project_or_404(self):
        return get_object_or_404(Project, pk=self.kwargs.get("uuid"))

    def perform_create(self, serializer):
        serializer.save(user=self.request.user.id, project=self.get_project_or_404())
        
    def get_queryset(self):
        query_set = Backlog.objects.filter(user=self.request.user.id, project=self.get_project_or_404())
        return query_set

现在我的页面看起来像这样:

enter image description here

但是如您在sprint标签中所见,有2个选择,一个分配给该项目,第二个分配给其他项目

我的问题是我如何才能仅显示该项目的选择!

它向我显示了所有的sprint选择,我只想在这里显示此特定项目的选择

我该如何实现?

1 个答案:

答案 0 :(得分:0)

您可以在项目查询中使用prefetch

 queryset = Project.objects.prefetch_related(Prefetch(
    'spring', queryset=Spring.objects.filter(project='your_project_id')))