簡體   English   中英

django rest api通過一個單獨的rest api調用一次保存兩個django模型

[英]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_detailsModelViewSet應該足以執行所需的所有操作。

暫無
暫無

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

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