【问题标题】:How do I query a Foreign key, but in reverse and list them in Django Rest Framework?如何查询外键,但反向并在 Django Rest Framework 中列出它们?
【发布时间】:2021-03-29 17:35:49
【问题描述】:

出于某种原因,我很难理解这一点。我知道如何在普通 Django 中执行此操作,但不确定如何在 DRF 中执行此操作。

class Novel(models.Model):
 name = models.CharField(max_length = 100)
 image = models.URLField(blank = True)
 linkNU = models.URLField(blank = True)
 author = models.ForeignKey(Author, on_delete = models.CASCADE, null = True)
 category = models.ManyToManyField(Category)
 description = models.TextField(blank = True)
 slug = models.SlugField(primary_key = True, default = None, max_length=100)
 numOfChaps = models.IntegerField(default = 0)
 novelStatus = models.BooleanField(default = True) #True will be for Ongoing, False for Completed
 def __str__(self):
    return self.name

章节模型如下所示

class Chapter(models.Model):
 index = models.IntegerField(default = None, blank = True)
 text = models.TextField(max_length=None)
 title = models.TextField(max_length = 100)
 novelParent = models.ForeignKey(Novel, on_delete = models.CASCADE, verbose_name = "chapter")
 nextChap = models.BooleanField(default = False)
 novSlugChapSlug = models.CharField( max_length = 100, blank = True, default = None)
 
def __str__(self):
    return f"Chapter {self.index} - {self.novelParent}"

现在这是我为 ChapterSerializer 提供的,但它不起作用:

class ChapterSerializer(serializers.ModelSerializer):
 novel = serializers.CharField(source = 'novelParent.name')
 novSlug = serializers.CharField(source = 'novelParent.slug')

 class Meta:
    model = Chapter
    fields = "__all__"
    # fields = ('index','title','text','nextChap','novel','novSlug','novSlugChapSlug')

我已经阅读并感觉它可能会在 ModelViewSet 的 def list 方法中完成。所以这就是我现在所拥有的,这也不起作用:

class ChapterSerializerView(viewsets.ViewSet):
 permission_classes = [ReadOnly]
 queryset = Chapter.objects.all()
 def list(self, request):
    queryset = Chapter.objects.all()
    serializer = ChapterSerializer(queryset, many=True)
    return Response(serializer.data)
# serializer_class = ChapterSerializer
 def retrieve(self, request, pk=None):
    queryset = Chapter.objects.all()
    chapter = get_object_or_404(queryset, novSlugChapSlug=pk)
    serializer = ChapterSerializer(chapter)
    return Response(serializer.data)

所以基本上我需要的是当我发送 API 请求时,例如 /api/chapters/harry-potter ,它列出了 Chapter 模型的所有章节索引和标题,与 Novel 模型的 slug 匹配。

感谢您的帮助:)

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    创建一个 SerializerMethodField。

    class ChapterSerializer(serializers.ModelSerializer):
     novelInfo = serializers.SerializerMethodField()
    
     class Meta:
        model = Chapter
        fields = ['novelInfo', 'index', 'text', 'title', ..]
        
        def get_novelInfo(self,obj):
            name = obj.novelParent.name
            slug = obj.novelParent.slug
            return {'name': name, 'slug': slug}
    

    更多关于 SerializerMethodField Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-18
      • 2018-08-04
      • 2017-10-05
      • 2013-04-27
      • 1970-01-01
      • 2019-07-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多