繁体   English   中英

如何获取此 Django REST 查询以显示所有字段,包括相关一对一表中的字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM