簡體   English   中英

如何在django rest框架中獲取所有字段,該框架在帶有外鍵的不同模型中被定義為相關名稱?

[英]How to get all fields in django rest framework which is defined as related name in a diffent model with foreign key?

這是我的models.py

from __future__ import unicode_literals
from django.db import models

class User(models.Model):
    name = models.CharField(max_length=200)
    company_name = models.ForeignKey('Company',on_delete=models.CASCADE,related_name='user')

    def __str__(self):
        return self.name

class Company(models.Model):
    name = models.CharField(max_length=200)
    phone_number = models.IntegerField(null=True,blank=True)

    def __str__(self):
        return self.name

class Catalog(models.Model):
    name = models.CharField(max_length=200)
    no_of_pcs = models.IntegerField(null=True,blank=True)
    per_piece_price = models.DecimalField(null=True,blank=True,max_digits=10,decimal_places=2)
    company_name = models.ForeignKey(Company,on_delete=models.CASCADE,related_name='catalog')

    def __str__(self):
        return self.name

這是我的serializers.py

from rest_framework import serializers
from .models import *
from django.db.models import Sum,Count

class CatalogSerializer(serializers.ModelSerializer):
    total_pieces = serializers.SerializerMethodField()
    total_price = serializers.SerializerMethodField()
    company_name = serializers.CharField()

    class Meta:
        model = Catalog
        fields = ('name','no_of_pcs','per_piece_price','company_name','total_pieces','total_price')

    def get_total_pieces(self, obj):
        totalpieces = Catalog.objects.aggregate(total_pieces=Count('no_of_pcs'))
        return totalpieces["total_pieces"]

    def get_total_price(self, obj):
        totalprice = Catalog.objects.aggregate(total_price=Sum('per_piece_price'))
        return totalprice["total_price"]

class UserSerializer(serializers.ModelSerializer):
    company_name = serializers.CharField()
    class Meta:
        model = User
        fields = '__all__'

class CatalogData(serializers.ModelSerializer):
    class Meta:
        model = Catalog
        fields = ('name', 'no_of_pcs', 'per_piece_price')


class CompanySerializer(serializers.ModelSerializer):
    catalog = CatalogData(many=True)
    user = UserSerializer(many=True)
    class Meta:
        model = Company
        fields = ('name', 'phone_number', 'catalog','user')

這是我的views.py

from __future__ import unicode_literals
from django.http import HttpResponse
from .models import *
import json
from django.http import JsonResponse, HttpResponse
from .serializers import *
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from rest_framework import viewsets


class CatalogView(viewsets.ModelViewSet):
    queryset =  Catalog.objects.select_related('company_name')
    serializer_class = CatalogSerializer

class CompanyView(viewsets.ModelViewSet):
    queryset =  Company.objects.all()
    serializer_class = CompanySerializer

class UserView(viewsets.ModelViewSet):
    queryset =  User.objects.all()
    serializer_class = UserSerializer

我正在獲得這樣的api。

[
    {
        "name": "sarees",
        "no_of_pcs": 23,
        "per_piece_price": "33333.00",
        "company_name": "google",
        "total_pieces": 3,
        "total_price": 471118.0
    }
]

在這里,我僅獲得公司模型的公司名稱。 但我期望同一公司的所有字段名稱。

但是我期望輸出-

像這樣:

[
    {
        "name": "sarees",
        "no_of_pcs": 23,
        "per_piece_price": "33333.00",
        "company": [
                {
                    "name": "google",
                    "phone_number": 323232
                }
            ],
        "total_pieces": 3,
        "total_price": 471118.0
    }
]

我想實現公司的所有領域。 與相同的API內的子列表

謝謝,

您可以為此使用嵌套序列化器。 將序列化器更改為此:

class CompanySerializer(serializers.ModelSerializer):
    catalog = CatalogData(many=True)
    user = UserSerializer(many=True)
    class Meta:
        model = Company
        fields = ('name', 'phone_number', 'catalog','user')

class CatalogSerializer(serializers.ModelSerializer):
    total_pieces = serializers.SerializerMethodField()
    total_price = serializers.SerializerMethodField()
    company = CompanySerializer(source='company_name') 

    class Meta:
        model = Catalog
        fields = ('name','no_of_pcs','per_piece_price','company','total_pieces','total_price')
        depth = 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM