Django-REST-framework如何查询两个没有关联的表然后返回给前端
时间: 2023-12-30 09:03:16 浏览: 133
在 Django-REST-framework 中,可以通过使用 SerializerMethodField 和 Serializer 类中的不同序列化器来从两个没有关联的表中查询数据并返回给前端。
下面是一个示例:
```python
# models.py
class Book(models.Model):
title = models.CharField(max_length=100)
author_name = models.CharField(max_length=50)
publisher_name = models.CharField(max_length=50)
class Publisher(models.Model):
name = models.CharField(max_length=50)
city = models.CharField(max_length=50)
```
在这个示例中,Book 模型类和 Publisher 模型类没有直接的关联关系。
为了在 API 中返回 Book 和 Publisher 的数据,可以创建一个新的序列化器类,并使用 SerializerMethodField 来查询 Publisher 的数据。
```python
# serializers.py
from rest_framework import serializers
from .models import Book, Publisher
class PublisherSerializer(serializers.ModelSerializer):
class Meta:
model = Publisher
fields = ('name', 'city')
class BookSerializer(serializers.ModelSerializer):
publisher = serializers.SerializerMethodField()
class Meta:
model = Book
fields = ('title', 'author_name', 'publisher')
def get_publisher(self, obj):
publisher = Publisher.objects.filter(name=obj.publisher_name).first()
return PublisherSerializer(publisher).data
```
在 BookSerializer 中,使用 SerializerMethodField 来定义一个虚拟字段 publisher,然后在 get_publisher 方法中查询 Publisher 数据并返回给前端。需要注意的是,在 get_publisher 中返回的是 PublisherSerializer(publisher).data,即使用 PublisherSerializer 对 Publisher 对象进行序列化。
最后,在视图函数中使用 BookSerializer 类来进行序列化。
```python
# views.py
from rest_framework import generics
from .models import Book
from .serializers import BookSerializer
class BookList(generics.ListAPIView):
queryset = Book.objects.all()
serializer_class = BookSerializer
```
以上代码示例中,BookList 视图函数将返回 Book 和 Publisher 的查询结果。
需要注意的是,这种方式在查询大量数据时可能会影响性能。如果需要进行复杂的查询操作,建议使用 Django ORM 的 query 方法进行查询和过滤。
阅读全文