如何以相反的关系访问另一个模型数据,反之亦然

时间:2018-09-23 12:55:56

标签: python django

api for catalogs

这是我的模型。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)

    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)

    def __str__(self):
        return self.name

这是我的seralizers.py

from rest_framework import serializers
from .models import *
from django.db.models import Sum,Avg,Max,Min,Count,F,Q

class CatalogSerializer(serializers.HyperlinkedModelSerializer):
    dynamic_data = serializers.SerializerMethodField()
    class Meta:
        model = Catalog
        fields = '__all__'

    def get_dynamic_data(self, obj):
        totalpieces = Catalog.objects.all().aggregate(total_pieces=Count('no_of_pcs'))
        totalprice = Catalog.objects.all().aggregate(total_price=Sum('per_piece_price'))
        return totalprice,totalpieces

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Company
        fields = '__all__'

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

这是我的view.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

这是我的urls.py

from django.conf.urls import url, include
from django.contrib import admin

from api import views
from rest_framework.urlpatterns import format_suffix_patterns
from rest_framework import routers

router = routers.DefaultRouter()
router.register('catalogs',views.CatalogView)
router.register('companies',views.CompanyView)
router.register('users',views.UserView)

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(router.urls)),
]

我什么时候去 http://127.0.0.1:8000/companies/

期待

 [
    {
        "url": "http://127.0.0.1:8000/companies/1/",
        "name": "google",
        "phone_number": 123214214,
        "catalog_details":[
             "url": "http://127.0.0.1:8000/catalogs/1/",
            "name": "sobhagya",
            "no_of_pcs": 22,
            "per_piece_price": "3567.00",
        ]
    }
]

在这里我可以访问目录中的公司名称,但是,如何访问我可以访问公司中的所有目录详细信息

请参考屏幕截图  我想以mbl的方式访问公司的目录详细信息,以访问目录api中的公司名称。

谢谢..

1 个答案:

答案 0 :(得分:0)

在公司序列化器中,显式添加Company类中的所有字段,包括目录的反向关系。

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    class Meta:
        model = Company
        fields = ('name', 'phone_number', 'catalog_set')

更好的是,在Catalog类中添加一个相关名称

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')

,然后在公司序列化程序的字段中将字段名称从catalog_set更改为catalog。

如果您想限制或修改要在公司序列化器中显示的目录数据,可以用这种方式定义目录序列化器

class CompanySerializer(serializers.HyperlinkedModelSerializer):
    catalog = CatalogSerializer()
    class Meta:
        model = Company
        fields = ('name', 'phone_number', 'catalog')
相关问题