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

Time:03-03

I have UserModel each user has multiple package and each package have price and program. 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)

serializer look like:

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)

and that what I get:

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

how can GET this RESULT?

{
            "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
                }
              ]
    }

CodePudding user response:

The problem is that your price and program models are not directly related to your user model. If you consider the relations it is like price -> package -> user, so you will have to get those relations in the package serializer instead like this

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__")

Note that this will however not give you the output in the format you mentioned though, the price and program fields will instead be nested under package.

[
    {
        "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"
    }
]

If you really want the format in the way you posted you might instead want to take a look at https://www.django-rest-framework.org/api-guide/fields/#serializermethodfield

  • Related