我的问题是如何在序列化程序中过滤外键?
首先,让我们看一下我的代码,然后我将向您详细解释一切!
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
现在我的页面看起来像这样:
但是如您在sprint标签中所见,有2个选择,一个分配给该项目,第二个分配给其他项目
我的问题是我如何才能仅显示该项目的选择!
它向我显示了所有的sprint选择,我只想在这里显示此特定项目的选择
我该如何实现?
答案 0 :(得分:0)
您可以在项目查询中使用prefetch
。
queryset = Project.objects.prefetch_related(Prefetch(
'spring', queryset=Spring.objects.filter(project='your_project_id')))