gpt4 book ai didi

django - DRF如何获取按类别分组的项目

转载 作者:行者123 更新时间:2023-12-04 07:16:42 25 4
gpt4 key购买 nike

我知道我的问题经常被重复,但我坚持这一点。
我想用 DRF 制作简单的 api。我有两个模型:

models.py

class Rubrics(models.Model):
id = models.AutoField(primary_key=True)
rubric = models.CharField(max_length=255, blank=True, null=True)

class Books(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=255, blank=True, null=True)
author = models.CharField(max_length=255, blank=True, null=True)
date = models.CharField(max_length=255, blank=True, null=True)
rubrics = models.ForeignKey('Rubrics', on_delete=models.DO_NOTHING, related_name='books', blank=True, null=True)
我想像这样查看序列化结果:
[
rubric1: [
{
title: "title1",
author:"author1"
},
book_obj2,
so on
],
rubric2: [
book_obj4,
book_obj5
]
]
我的意见.py:
class BooksByRubricView(APIView):
"""List of books by rubrics"""

def get(self, request):
last_date = Books.objects.latest("date").date
books_last = Books.objects.filter(date=last_date)
serializer = RubricsSerializer(books_last, many=True)
return Response(serializer.data)
我在这个主题中尝试了很多例子,
sorry this garbage
class BookSerializer(serializers.ModelSerializer):
class Meta:
model = Books
#fields = ("title",)
exclude = ()

class RubricsSerializer(serializers.ModelSerializer):
rubrics = BookSerializer(read_only=True)
class Meta:
model = Rubrics
fields = ("rubrics",)
#exclude = ()
"""
class RubricSerializer(serializers.ModelSerializer):
#rubrics = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
#books = RecursiveSerializer(many=True)
#print(books)
rubrics = RubricSerializer(read_only=True)
#books = BooksListSerializer(many=True)
class Meta:
model = Books
fields = ("title", "rubrics",)
#fields = ['rubric', 'rubrics']
#fields = ['books', 'rubrics']
"""

但也许我不了解 DRF 中反向关系和序列化的原则。请告诉我WAIDW。谢谢。
更新。
我只想对指定的数据集进行操作(例如,处理最后上传的书籍),而不是对整个表 Books 进行操作。所以我只想查看这个集合中的评分细则,而不是表格评分细则中的所有评分细则。是的,书籍在指定字段中只有一个 rubric id,并且 rubric 与书籍是一对多的关系。
嗯,这就是我想看到的 json(当然,这部作品中出现的所有角色都是虚构的。任何与真实人物、生者或死者的相似之处纯属巧合。):
{
"rubric1": [{
"author": "Marley W. Watkins",
"title": "A Step-By-Step Guide to Exploratory Factor Analysis with Stata"
}, {
"author": "Robert E. Davis",
"title": "Auditing Information and Cyber Security Governance; A Controls-Based Approach"
}, {
"author": "Gerhard X. Ritter, Gonzalo Urcid",
"title": "Introduction to Lattice Algebra: With Applications in AI, Pattern Recognition, Image Analysis, and Biomimetic Neural Networks"
}],
"rubric2": [{
"author": "Richard Cross and JT Paasch",
"title": "The Routledge Companion to Medieval Philosophy"
}, {
"author": "Nicholas Allott (editor), Terje Lohndal (editor), Georges Rey (editor)",
"title": "A Companion to Chomsky"
}, {
"author": "Olakunle George",
"title": "A Companion to African Literatures"
}, {
"author": "Tim Byrnes, Ebubechukwu O. Ilo-Okeke",
"title": "Quantum Atom Optics: Theory and Applications to Quantum Technology"
}],
"rubric3": [{
"author": "Hiroyoshi Naito",
"title": "Organic Semiconductors for Optoelectronics"
}, {
"author": "Bassem R. Mahafza, Scott C. Winton",
"title": "Handbook of Radar Signal Analysis"
}, {
"author": "Sean McManus, Mike Cook",
"title": "Raspberry Pi For Dummies, 4th Edition"
}]
}
我在“普通”django中意识到:
class BooksByRubricView(APIView):
"""List of books by rubrics"""

def get(self, request):
last_date = Books.objects.using('books').latest("date").date
books_last = Books.objects.using('books').filter(date=last_date)

categories = []
res_dict = {}

for item in books_last:
categories.append(item.rubrics_id)

categories = set(categories)

for item in categories:
temp_list = []
temp_qs = books_last.filter(rubrics_id=item)
for i in temp_qs:
temp_list.append({"author": i["author"], "title": i["title"]})

res_dict["rubric"+str(item)]=list(temp_list)

# res = json.dumps(res_dict)
return JsonResponse(res_dict, safe=False, json_dumps_params={'ensure_ascii': False})
我可以用 drf 序列化器来实现它,或者最简单的方法是不费脑筋并返回 json 如上所述?
UPD2。
好吧,在使用序列化程序和 generic.APIView 进行一些魔术之后,我得到的结果并不完全符合预期,但非常接近。例子(当然,本作品中出现的所有人物都是虚构的。任何与真实人物,生者或死者的相似之处,纯属巧合)
views.py
class BooksByRubricView2(generics.ListAPIView):
"""Books grouped by rubrics"""
serializer_class = RubricsSerializer2
queryset = Rubrics.objects.all()

#OR without generic
class BooksByRubricView3(APIView):

def get(self, request):
r = Rubrics.objects.all()
serializer=RubricsSerializer2(r,many=True)
return Response(serializer.data)

serializers.py
class FilteredListSerializer(serializers.ListSerializer):
"""Serializer to filter Book table, look for latest date for every rubric"""

def to_representation(self, data):
latest_data = data.latest("date").date
data = data.filter(date=latest_data)
return super(FilteredListSerializer, self).to_representation(data)


class BookSerializer2(serializers.ModelSerializer):
class Meta:
model = Books
list_serializer_class = FilteredListSerializer
fields = (
"title",
"author",
"date")


class RubricsSerializer2(serializers.ModelSerializer):
books = BookSerializer2(many=True, read_only=True)
class Meta:
model = Rubrics
fields = ("rubric", "books",)

result:
[
{
"rubric": "Computers",
"books": [
{
"title": "A Step-By-Step Guide to Exploratory Factor Analysis with Stata",
"author": "Marley W. Watkins",
"date": "2021-08-08"
},
{
"title": "Auditing Information and Cyber Security Governance; A Controls-Based Approach",
"author": "Robert E. Davis",
"date": "2021-08-08"
}
]
},
{
"rubric": "Education",
"books": [
{
"title": "The Routledge Companion to Medieval Philosophy",
"author": "Richard Cross and JT Paasch",
"date": "2021-08-08"
}
]
},
so on
}
这是一种肮脏的方式,因为表 Rubrics 中的每个 Rubric 都会创建自己对表 Books 的查询,并且每个 Rubric 都有自己的最新日期。但 DRF 过滤将是下一步... =)
谢谢大家,“我会回来的”

最佳答案

没有字段rubricsRubrics模型,可用字段有:

  • id , rubric来自模型本身,
  • books_set代表所有具有 FK 引用的书籍 Rubrics实例。看看this official docs

  • 一本书有一个rubric(rubrics外键),rubric有多本书(books_set)。我还建议从 rubrics 更改 FK 名称至 rubric因为只能有一个。
    试试这个并从那里开始工作:
    class BookSerializer(serializers.ModelSerializer):
    class Meta:
    model = Books
    #fields = ("title",)
    exclude = ()

    class RubricsSerializer(serializers.ModelSerializer):
    class Meta:
    model = Rubrics
    fields = ("books_set",)
    #exclude = ()

    关于django - DRF如何获取按类别分组的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68718911/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com