0

Я создаю django rest api для сохранения/управления данными клиента для моего проекта. У меня две модели. Клиент для хранения основного клиента и CustomerDetails для хранения информации о клиенте. Я хочу написать один api для создания/обновления данных для обеих моделей.django rest api сохранить две модели django за один раз за один вызов вызова 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)) 
] 
+0

Вы пытались (APIView) insted of (generics.CreateAPIView) – Cadmus

+0

Почему у вас не используется тот же идентификатор (модели клиента), что и внешний ключ в модели данных клиента, поэтому будет эффективно ссылаться на детали клиента и наоборот. –

+0

@ PiyushS.Wanare, Вы имеете в виду вот так? 'код класса CustomerDetails (models.Model): клиент = models.ForeignKey (Заказчик, primary_key = True, db_index = True, on_delete = models.CASCADE, related_name = 'customer_details', по умолчанию = 0) spouse_name = models.CharField (mAX_LENGTH = 256) интересы = models.CharField (max_length = 256) "" "много больше полей, чтобы идти" "" ' –

ответ

0

Мое предложение

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 
+0

Жаль, что это не сработало –

+0

Вы столкнулись с какой-либо проблемой – Cadmus

0

Я не знаю, почему вам нужно CustomerCreateAPIView в этом. ModelViewSet должно быть более чем достаточно для выполнения всех необходимых действий, если вы предоставите правильные customer_details в своих данных POST.

Смежные вопросы