[英]How to get this Django REST query to display all fields, including fields from related one-to-one table
这是我的 Django models.py
,其中 2 个表具有一对一的表关系。 UserComputedInfo model 与 CustomUser model 具有一对一的关系。
from django.contrib.auth.models import AbstractUser
from django.db import models
from django.contrib.auth import get_user_model
class CustomUser(AbstractUser):
email = models.EmailField(unique=True)
post_code = models.DecimalField(max_digits=9, decimal_places=6)
def __str__(self):
return self.username
class UserComputedInfo(models.Model):
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE)
copy_input = models.DecimalField(max_digits=9, decimal_places=6)
def __str__(self):
return self.copy_input
我正在尝试创建一个 REST API 来显示两个表中的所有字段。 我正在使用 Django REST 框架。
这是我的serializers.py
from rest_framework import serializers
from users.models import CustomUser
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
fields = ("email", "post_code")
model = CustomUser
这是我的views.py
from rest_framework import generics
from django.contrib.auth import get_user_model
from .serializers import CustomUserSerializer
class PostCodeAPIView(generics.ListAPIView):
queryset = get_user_model().objects.all()
serializer_class = CustomUserSerializer
API 将显示CustomUser
表中的所有字段。 但是,我也想显示相关的一对一UserComputedInfo
表中的所有字段。
I am using Django v4, python v3.9, Django REST framework on Windows 10.
您可以像这样在CustomUserSerializer
中使用UserComputedInfoSerializer
# serializers.py
from rest_framework import serializers
from users.models import CustomUser, UserComputedInfo
class UserComputedInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserComputedInfo
fields = "__all__"
class CustomUserSerializer(serializers.ModelSerializer):
UserComputedInfo = UserComputedInfoSerializer(source="usercomputedinfo")
class Meta:
fields = ("email", "post_code", "UserComputedInfo")
model = CustomUser
如果你只想要它read_only
所以UserComputedInfoSerializer(read_only=True)
else 也应该手动处理UserComputedInfoSerializer
的操作。
我会回答我自己的问题。 它已经过测试可以成功运行。
# serializers.py
from rest_framework import serializers
from users.models import CustomUser
class CustomUserSerializer(serializers.ModelSerializer):
class Meta:
fields = ("email", "post_code", "usercomputedinfo")
model = CustomUser
depth = 1 # display all the fields in related 1-to-1 table
In https://www.django-rest-framework.org/api-guide/serializers/#modelserializer , it is stated that the ModelSerializer class provides a shortcut that lets you automatically create a Serializer class with fields that correspond to the Model fields.
字段usercomputedinfo
对应于一对一的表UserComputedInfo
。 请特别注意,字段的命名遵循 ModelSerializer 使用的约定。 在这种情况下,它必须全部小写。 如果您使用UserComputedInfo
作为字段,它将不起作用。 我找不到有关 ModelSerializer 使用的字段命名约定的文档。 depth = 1
是生成嵌套表示所必需的。
有时我们想要指定特定的字段,而不是显示所有字段。 这是执行此操作的代码。
from rest_framework import serializers
from users.models import CustomUser, UserComputedInfo
class UserComputedInfoSerializer(serializers.ModelSerializer):
class Meta:
model = UserComputedInfo
fields = ("copy_input")
class CustomUserSerializer(serializers.ModelSerializer):
usercomputedinfo = UserComputedInfoSerializer()
class Meta:
fields = ("email", "postal_code", "usercomputedinfo")
model = CustomUser
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.