如何使用 Django Rest Framework 在一个 APIVIEW 中获取多个模型序列化器

How to GET multipule ModelSrializer in one APIVIEW using Django Rest Framework

我有 UserModel 每个用户有多个 package,每个包有 priceprogram。 model.py:

class User(models.Model):
    name= models.CharField(max_length=100)
class Package(models.Model):
    package_name = models.CharField(max_length=100)
    user= models.ForeignKey(User, on_delete=models.CASCADE,related_name='user_package')
class Program(models.Model):
    title = models.CharField(max_length=100)
    user_package = models.ForeignKey(Package, on_delete=models.CASCADE)
class Price(models.Model):
    price = models.FloatField()
    user_package = models.ForeignKey(Package, on_delete=models.CASCADE)

序列化器看起来像:

class UserSerializer(NestedCreateMixin, NestedUpdateMixin,serializers.ModelSerializer):
    program = ProgramSerializer(source='user_program', many=True, read_only=True)
    package = PackageSerializer(source='user_package', many=True, read_only=True)
    price = PriceSerializer(source='price', many=True, read_only=True)
    class Meta:
        model = User
        fields= ("__all__")

views.py:

class user_apiView(APIView):
    def get(self, request):
        user= user.objects.all()
        serializer = UserSerializer(user, many = True)
        return Response(serializer.data)

这就是我得到的:

{
        "id": 1,
        "package": [
            {
                "id": 1,
                "package_name": "wfe",
                "user": 1
            },
            {
                "id": 2,
                "package_name": "wfe",
                "user": 1
            }
        ]
}

怎样才能得到这个结果?

{
            "id": 1,
            "package": [
                {
                    "id": 1,
                    "package_name": "wfe",
                    "user": 1
                },
                {
                    "id": 2,
                    "package_name": "wfe",
                    "user": 1
                }
              ],
             "price": [
                {
                    "id": 1,
                    "price": "wfe",
                    "package": 1
                },
                {
                    "id": 2,
                    "price": "wfe",
                    "package": 2
                }
              ]
              "program": [
                {
                    "id": 1,
                    "title": "wfe",
                    "package": 1
                },
                {
                    "id": 2,
                    "title": "wfe",
                    "package": 2
                }
              ]
    }

问题是你的价格和程序模型与你的用户模型没有直接关系。如果你考虑它像 price -> package -> user 的关系,那么你将不得不在包序列化程序中获取这些关系,而不是像这样

serializers.py

class ProgramSerializer(serializers.ModelSerializer):
    class Meta:
        model = Program
        fields= ("__all__")


class PriceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Price
        fields= ("__all__")

class PackageSerializer(serializers.ModelSerializer):
    program = ProgramSerializer(source='program_set', many=True, read_only=True)
    price = PriceSerializer(source='price_set', many=True, read_only=True)

    class Meta:
        model = Package
        fields= ("__all__")

class UserSerializer(serializers.ModelSerializer):
    package = PackageSerializer(source='user_package', many=True, read_only=True)
    
    class Meta:
        model = User
        fields= ("__all__")

请注意,这不会以您提到的格式为您提供输出,价格和程序字段将嵌套在包下。

[
    {
        "id": 1,
        "package": [
            {
                "id": 1,
                "program": [
                    {
                        "id": 1,
                        "title": "program1",
                        "user_package": 1
                    }
                ],
                "price": [
                    {
                        "id": 1,
                        "price": 1000.0,
                        "user_package": 1
                    }
                ],
                "package_name": "package1",
                "user": 1
            },
            {
                "id": 2,
                "program": [
                    {
                        "id": 2,
                        "title": "program2",
                        "user_package": 2
                    }
                ],
                "price": [
                    {
                        "id": 2,
                        "price": 1500.0,
                        "user_package": 2
                    }
                ],
                "package_name": "package2",
                "user": 1
            }
        ],
        "name": "user1"
    }
]

如果您真的想要您发布的格式,您可能想看看 https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield