[英]Django Rest API. Get all data from different models in a single API call
[英]django rest api save two django models at a time through a single rest api call
我正在構建django rest api,用於保存/管理我的項目的客戶數據。 我有兩個模型。 用於存儲基本客戶詳細信息的客戶和用於存儲一堆客戶詳細信息的CustomerDetails。 我想編寫一個API來創建/更新兩個模型的數據。
我怎樣才能做到這一點?
models.py
class Customer(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=20)
address = models.CharField(max_length=50)
city = models.CharField(max_length=256)
"""some more fields to go"""
# Create your models here.
class CustomerDetails(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
customer = models.ForeignKey(Customer, db_index=True, on_delete=models.CASCADE,
related_name='customer_details',
default=0)
spouse_name = models.CharField(max_length=256)
interests = models.CharField(max_length=256)
"""many more fields to go"""
views.py
import pprint
from .models import Customer, CustomerDetails
from oauth2_provider.ext.rest_framework import TokenHasReadWriteScope, TokenHasScope
from rest_framework import permissions, viewsets
from .serializers import CustomerSerializer, CustomerDetailsSerializer
from django.contrib import admin
from rest_framework import generics
admin.autodiscover()
# Create your views here.
# ViewSets define the view behavior.
class CustomerViewSet(viewsets.ModelViewSet):
permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
queryset = Customer.objects.all()
serializer_class = CustomerSerializer
def perform_create(self, serializer):
serializer.save(user=self.request.user)
class CustomerCreateAPIView(generics.CreateAPIView):
model = Customer
serializer_class = CustomerSerializer
serializers.py
from rest_framework import serializers
from models import Customer, CustomerDetails
class CustomerDetailsSerializer(serializers.ModelSerializer):
class Meta:
model = CustomerDetails
fields = ('spouse_name',)
class CustomerSerializer(serializers.ModelSerializer):
customer_details = CustomerDetailsSerializer()
class Meta:
model = Customer
fields = ('name', 'city', 'customer_details')
urls.py
router = routers.SimpleRouter(trailing_slash=False)
router.register(r'customer', views.CustomerViewSet, 'customers')
urlpatterns = [
url(r'^', include(router.urls))
]
我的建議
Views.py
from rest_framework.views import APIView
from rest_framework.parsers import MultiPartParser, FormParser
class CustomerProfile(APIView):
parser_classes = (MultiPartParser, FormParser,) # File upload
def post(self, request, pk=None, format=None):
data = request.data
required_fields = ['name'] # required fields
for field in required_fields:
if field not in data.keys():
return JSONResponse({'status':"error", "field_name":field, "message":"{0} field required" .format(field) })
elif not data.get(field):
return JSONResponse({'status':"error", "field_name":field, "message":"{0} field not empty" .format(field) })
## Validate
if pk:
try:
customer = Customer.objects.get(id=pk)
except Customer.DoesNotExist:
pass # Return Error
else:
customer = Customer.objects.create(name=data['address'], city=data['city'], name=data['name'])
cd = CustomerDetails.objects.create(customer=customer,....)
return JSONResponse({'status':"success", "message":"Successfully updated profile",'full_name':artist.full_name, 'detial':detail_url})
urls.py
from apps.sample import views
url(r'^api/v1/customer/$', views.CustomerProfile.as_view()), ## For Save customer detail
url(r'^api/v1/customer/(?P<pk>[0-9]+)/$', views.CustomerProfile.as_view()), ## Edit Customer Detail
我真的不知道為什么您需要其中的CustomerCreateAPIView
。 只要在POST數據中提供正確的customer_details
, ModelViewSet
應該足以執行所需的所有操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.