[英]How do I query a Foreign key, but in reverse and list them in Django Rest Framework?
出于某种原因,我很难理解这一点。 我知道如何在普通的 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
章Model长这样
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,它列出了章节 model 的所有章节索引和标题,它与 Novel Z20F35E630DAF494DFA4C 的 slug 匹配。
谢谢您的帮助:)
创建一个 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 文档的更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.