drf foreign
时间: 2023-11-09 14:57:58 浏览: 96
DRF中的外键(ForeignKey)是一种关系字段,用于建立模型之间的一对多关系。通过外键,一个模型可以引用另一个模型的实例。在DRF的序列化器中,可以使用外键字段来表示模型之间的关联关系。
在示例中,UserFeedback模型使用了外键字段来表示与User模型之间的关系。具体而言,user字段是一个外键字段,它引用了User模型,并且通过verbose_name参数指定了字段在后台管理界面中显示的名称。
为了在DRF中序列化和反序列化UserFeedback模型,可以创建一个相应的序列化器。在序列化器中,可以通过继承HyperlinkedModelSerializer类来生成序列化器,并在Meta类中指定相关的模型和字段。
相关问题
DRF 多级嵌套数据 完整例子
下面是一个 DRF 实现多级嵌套数据的完整例子,展示了如何使用 Serializer 嵌套来实现多级嵌套数据的 API:
models.py:
```python
from django.db import models
class Category(models.Model):
name = models.CharField(max_length=50)
def __str__(self):
return self.name
class Product(models.Model):
name = models.CharField(max_length=50)
price = models.DecimalField(max_digits=8, decimal_places=2)
category = models.ForeignKey(Category, on_delete=models.CASCADE)
def __str__(self):
return self.name
```
serializers.py:
```python
from rest_framework import serializers
from .models import Category, Product
class ProductSerializer(serializers.ModelSerializer):
class Meta:
model = Product
fields = ('id', 'name', 'price')
class CategorySerializer(serializers.ModelSerializer):
products = ProductSerializer(many=True)
class Meta:
model = Category
fields = ('id', 'name', 'products')
```
views.py:
```python
from rest_framework import viewsets
from .models import Category, Product
from .serializers import CategorySerializer, ProductSerializer
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
class CategoryViewSet(viewsets.ModelViewSet):
queryset = Category.objects.all()
serializer_class = CategorySerializer
```
在上面的例子中,Category 表示类别模型,其中包含了类别的名称,Product 表示产品模型,其中包含了产品的名称、价格和所属类别。在 ProductSerializer 中,表示产品的序列化器,只包含了产品的基本信息。在 CategorySerializer 中,表示类别的序列化器,通过 ProductSerializer 来嵌套表示产品的信息。在 CategoryViewSet 和 ProductViewSet 中,分别表示类别和产品的 API 视图集合,其中 CategoryViewSet 中的 queryset 包含了所有的类别,ProductViewSet 中的 queryset 包含了所有的产品。通过访问 /categories/ 可以获取所有的类别信息,包含了每个类别的所有产品信息。
drf 实现多级菜单的完整例子
下面是一个 DRF 实现多级菜单的完整例子,展示了如何使用 Serializer 嵌套和 ModelViewSet 来实现多级菜单的 API:
models.py:
```python
from django.db import models
class Menu(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)
def __str__(self):
return self.name
```
serializers.py:
```python
from rest_framework import serializers
from .models import Menu
class MenuSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Menu
fields = ('id', 'name', 'parent', 'children')
def get_children(self, obj):
serializer = self.__class__(obj.children.all(), many=True)
return serializer.data
```
views.py:
```python
from rest_framework import viewsets
from .models import Menu
from .serializers import MenuSerializer
class MenuViewSet(viewsets.ModelViewSet):
queryset = Menu.objects.filter(parent=None)
serializer_class = MenuSerializer
def get_queryset(self):
parent_id = self.request.query_params.get('parent')
if parent_id:
return Menu.objects.filter(parent=parent_id)
return super().get_queryset()
```
在上面的例子中,Menu 表示菜单模型,其中包含了菜单的名称和父菜单。在 MenuSerializer 中,使用 SerializerMethodField 来表示子菜单,通过递归嵌套 MenuSerializer,就能够实现多级菜单的序列化。在 MenuViewSet 中,重写了 get_queryset 方法来实现根据父菜单查询子菜单的功能。通过访问 /menus/ 可以获取所有的一级菜单,访问 /menus/?parent=id 可以获取指定父菜单的子菜单。
阅读全文