0

Ich baue eine django rest api zum speichern/verwalten von kundendaten für mein projekt. Ich habe zwei Modelle. Kunde für die Speicherung der Grunddaten Details und Kundendetails für die Speicherung einer Reihe von Kundendetails. Ich möchte eine einzelne API schreiben, um Daten für beide Modelle zu erstellen/zu aktualisieren.django rest api spare zwei django models gleichzeitig durch einen einzigen rest api call

Wie kann ich das tun?

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

Haben Sie versucht (APIView) von (generics.CreateAPIView) – Cadmus

+0

Warum haben Sie nicht die gleiche ID (des Kundenmodells) als Fremdschlüssel im Kundendetailmodell verwendet, so dass es effizient ist, die Details des Kunden zu verweisen und umgekehrt. –

+0

@ PiyushS.Wanare, Du meinst so? 'Code Klasse Kundendetails (models.Model): Kunde = models.ForeignKey (Kunde, primary_key = True, db_index = True, on_delete = models.CASCADE, related_name = 'Kunden_Details', default = 0) spouse_name = models.CharField (max_length = 256) Interessen = models.CharField (max_length = 256) "" "viele weitere Felder zu gehen" "" ' –

Antwort

0

Mein Vorschlag

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

Sorry, es hat nicht funktioniert –

+0

hast du irgendein Problem gesehen – Cadmus

0

Ich weiß nicht wirklich, warum Sie CustomerCreateAPIView in diese benötigen. ModelViewSet sollte mehr als genug sein, um alle erforderlichen Aktionen auszuführen, solange Sie in Ihren POST-Daten die korrekten customer_details angeben.

Verwandte Themen